<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.6"/>
<title>libasyncd: ad_server.c Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
  $(document).ready(initResizable);
  $(window).load(resizeHeight);
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td style="padding-left: 0.5em;">
   <div id="projectname">libasyncd
   </div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.6 -->
  <div id="navrow1" class="tabs">
    <ul class="tablist">
      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
      <li class="current"><a href="files.html"><span>Files</span></a></li>
    </ul>
  </div>
  <div id="navrow2" class="tabs2">
    <ul class="tablist">
      <li><a href="files.html"><span>File&#160;List</span></a></li>
      <li><a href="globals.html"><span>Globals</span></a></li>
    </ul>
  </div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
  <div id="nav-tree">
    <div id="nav-tree-contents">
      <div id="nav-sync" class="sync"></div>
    </div>
  </div>
  <div id="splitbar" style="-moz-user-select:none;" 
       class="ui-resizable-handle">
  </div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('ad__server_8c_source.html','');});
</script>
<div id="doc-content">
<div class="header">
  <div class="headertitle">
<div class="title">ad_server.c</div>  </div>
</div><!--header-->
<div class="contents">
<a href="ad__server_8c.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span>&#160;<span class="comment">/******************************************************************************</span></div>
<div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;<span class="comment"> * libasyncd</span></div>
<div class="line"><a name="l00003"></a><span class="lineno">    3</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00004"></a><span class="lineno">    4</span>&#160;<span class="comment"> * Copyright (c) 2014 Seungyoung Kim.</span></div>
<div class="line"><a name="l00005"></a><span class="lineno">    5</span>&#160;<span class="comment"> * All rights reserved.</span></div>
<div class="line"><a name="l00006"></a><span class="lineno">    6</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00007"></a><span class="lineno">    7</span>&#160;<span class="comment"> * Redistribution and use in source and binary forms, with or without</span></div>
<div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;<span class="comment"> * modification, are permitted provided that the following conditions are met:</span></div>
<div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;<span class="comment"> * 1. Redistributions of source code must retain the above copyright notice,</span></div>
<div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;<span class="comment"> *    this list of conditions and the following disclaimer.</span></div>
<div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;<span class="comment"> * 2. Redistributions in binary form must reproduce the above copyright notice,</span></div>
<div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;<span class="comment"> *    this list of conditions and the following disclaimer in the documentation</span></div>
<div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;<span class="comment"> *    and/or other materials provided with the distribution.</span></div>
<div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;<span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot;</span></div>
<div class="line"><a name="l00017"></a><span class="lineno">   17</span>&#160;<span class="comment"> * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE</span></div>
<div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;<span class="comment"> * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE</span></div>
<div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;<span class="comment"> * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE</span></div>
<div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;<span class="comment"> * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR</span></div>
<div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;<span class="comment"> * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF</span></div>
<div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;<span class="comment"> * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS</span></div>
<div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;<span class="comment"> * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN</span></div>
<div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;<span class="comment"> * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)</span></div>
<div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;<span class="comment"> * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE</span></div>
<div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;<span class="comment"> * POSSIBILITY OF SUCH DAMAGE.</span></div>
<div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;<span class="comment"> *****************************************************************************/</span></div>
<div class="line"><a name="l00028"></a><span class="lineno">   28</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00029"></a><span class="lineno">   29</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00030"></a><span class="lineno">   30</span>&#160;<span class="comment"> * Main core logic of the server implementation.</span></div>
<div class="line"><a name="l00031"></a><span class="lineno">   31</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00032"></a><span class="lineno">   32</span>&#160;<span class="comment"> * @file ad_server.c</span></div>
<div class="line"><a name="l00033"></a><span class="lineno">   33</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00034"></a><span class="lineno">   34</span>&#160;</div>
<div class="line"><a name="l00035"></a><span class="lineno">   35</span>&#160;<span class="preprocessor">#include &lt;stdbool.h&gt;</span></div>
<div class="line"><a name="l00036"></a><span class="lineno">   36</span>&#160;<span class="preprocessor">#include &lt;stdlib.h&gt;</span></div>
<div class="line"><a name="l00037"></a><span class="lineno">   37</span>&#160;<span class="preprocessor">#include &lt;strings.h&gt;</span></div>
<div class="line"><a name="l00038"></a><span class="lineno">   38</span>&#160;<span class="preprocessor">#include &lt;arpa/inet.h&gt;</span></div>
<div class="line"><a name="l00039"></a><span class="lineno">   39</span>&#160;<span class="preprocessor">#include &lt;netinet/in.h&gt;</span></div>
<div class="line"><a name="l00040"></a><span class="lineno">   40</span>&#160;<span class="preprocessor">#include &lt;errno.h&gt;</span></div>
<div class="line"><a name="l00041"></a><span class="lineno">   41</span>&#160;<span class="preprocessor">#include &lt;assert.h&gt;</span></div>
<div class="line"><a name="l00042"></a><span class="lineno">   42</span>&#160;<span class="preprocessor">#include &lt;sys/un.h&gt;</span></div>
<div class="line"><a name="l00043"></a><span class="lineno">   43</span>&#160;<span class="preprocessor">#include &lt;sys/socket.h&gt;</span></div>
<div class="line"><a name="l00044"></a><span class="lineno">   44</span>&#160;<span class="preprocessor">#include &lt;event2/event.h&gt;</span></div>
<div class="line"><a name="l00045"></a><span class="lineno">   45</span>&#160;<span class="preprocessor">#include &lt;event2/bufferevent.h&gt;</span></div>
<div class="line"><a name="l00046"></a><span class="lineno">   46</span>&#160;<span class="preprocessor">#include &lt;event2/bufferevent_ssl.h&gt;</span></div>
<div class="line"><a name="l00047"></a><span class="lineno">   47</span>&#160;<span class="preprocessor">#include &lt;event2/thread.h&gt;</span></div>
<div class="line"><a name="l00048"></a><span class="lineno">   48</span>&#160;<span class="preprocessor">#include &lt;event2/listener.h&gt;</span></div>
<div class="line"><a name="l00049"></a><span class="lineno">   49</span>&#160;<span class="preprocessor">#include &lt;openssl/ssl.h&gt;</span></div>
<div class="line"><a name="l00050"></a><span class="lineno">   50</span>&#160;<span class="preprocessor">#include &lt;openssl/rand.h&gt;</span></div>
<div class="line"><a name="l00051"></a><span class="lineno">   51</span>&#160;<span class="preprocessor">#include &lt;openssl/conf.h&gt;</span></div>
<div class="line"><a name="l00052"></a><span class="lineno">   52</span>&#160;<span class="preprocessor">#include &lt;openssl/engine.h&gt;</span></div>
<div class="line"><a name="l00053"></a><span class="lineno">   53</span>&#160;<span class="preprocessor">#include &lt;openssl/err.h&gt;</span></div>
<div class="line"><a name="l00054"></a><span class="lineno">   54</span>&#160;<span class="preprocessor">#include &quot;macro.h&quot;</span></div>
<div class="line"><a name="l00055"></a><span class="lineno">   55</span>&#160;<span class="preprocessor">#include &quot;qlibc/qlibc.h&quot;</span></div>
<div class="line"><a name="l00056"></a><span class="lineno">   56</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="ad__server_8h.html">ad_server.h</a>&quot;</span></div>
<div class="line"><a name="l00057"></a><span class="lineno">   57</span>&#160;</div>
<div class="line"><a name="l00058"></a><span class="lineno">   58</span>&#160;<span class="preprocessor">#ifdef __linux__</span></div>
<div class="line"><a name="l00059"></a><span class="lineno">   59</span>&#160;<span class="preprocessor"></span><span class="preprocessor">#include &lt;sys/eventfd.h&gt;</span></div>
<div class="line"><a name="l00060"></a><span class="lineno">   60</span>&#160;<span class="preprocessor">#else</span></div>
<div class="line"><a name="l00061"></a><span class="lineno">   61</span>&#160;<span class="preprocessor"></span><span class="preprocessor">#include &lt;sys/event.h&gt;</span></div>
<div class="line"><a name="l00062"></a><span class="lineno">   62</span>&#160;<span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00063"></a><span class="lineno">   63</span>&#160;<span class="preprocessor"></span></div>
<div class="line"><a name="l00064"></a><span class="lineno">   64</span>&#160;<span class="preprocessor">#ifndef _DOXYGEN_SKIP</span></div>
<div class="line"><a name="l00065"></a><span class="lineno">   65</span>&#160;<span class="preprocessor"></span><span class="comment">/*</span></div>
<div class="line"><a name="l00066"></a><span class="lineno">   66</span>&#160;<span class="comment"> * User callback hook container.</span></div>
<div class="line"><a name="l00067"></a><span class="lineno">   67</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00068"></a><span class="lineno">   68</span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span>ad_hook_s ad_hook_t;</div>
<div class="line"><a name="l00069"></a><span class="lineno">   69</span>&#160;<span class="keyword">struct </span>ad_hook_s {</div>
<div class="line"><a name="l00070"></a><span class="lineno">   70</span>&#160;    <span class="keywordtype">char</span> *method;</div>
<div class="line"><a name="l00071"></a><span class="lineno">   71</span>&#160;    <a class="code" href="ad__server_8h.html#a659a16c6e03fa96212bff528033efc84">ad_callback</a> cb;</div>
<div class="line"><a name="l00072"></a><span class="lineno">   72</span>&#160;    <span class="keywordtype">void</span> *userdata;</div>
<div class="line"><a name="l00073"></a><span class="lineno">   73</span>&#160;};</div>
<div class="line"><a name="l00074"></a><span class="lineno">   74</span>&#160;</div>
<div class="line"><a name="l00075"></a><span class="lineno">   75</span>&#160;<span class="comment">/*</span></div>
<div class="line"><a name="l00076"></a><span class="lineno">   76</span>&#160;<span class="comment"> * Local functions.</span></div>
<div class="line"><a name="l00077"></a><span class="lineno">   77</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00078"></a><span class="lineno">   78</span>&#160;<span class="keyword">static</span> <span class="keywordtype">int</span> notify_loopexit(<a class="code" href="structad__server__s.html">ad_server_t</a> *server);</div>
<div class="line"><a name="l00079"></a><span class="lineno">   79</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> notify_cb(<span class="keyword">struct</span> bufferevent *buffer, <span class="keywordtype">void</span> *userdata);</div>
<div class="line"><a name="l00080"></a><span class="lineno">   80</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> *server_loop(<span class="keywordtype">void</span> *instance);</div>
<div class="line"><a name="l00081"></a><span class="lineno">   81</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> close_server(<a class="code" href="structad__server__s.html">ad_server_t</a> *server);</div>
<div class="line"><a name="l00082"></a><span class="lineno">   82</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> libevent_log_cb(<span class="keywordtype">int</span> severity, <span class="keyword">const</span> <span class="keywordtype">char</span> *msg);</div>
<div class="line"><a name="l00083"></a><span class="lineno">   83</span>&#160;<span class="keyword">static</span> <span class="keywordtype">int</span> set_undefined_options(<a class="code" href="structad__server__s.html">ad_server_t</a> *server);</div>
<div class="line"><a name="l00084"></a><span class="lineno">   84</span>&#160;<span class="keyword">static</span> SSL_CTX *init_ssl(<span class="keyword">const</span> <span class="keywordtype">char</span> *cert_path, <span class="keyword">const</span> <span class="keywordtype">char</span> *pkey_path);</div>
<div class="line"><a name="l00085"></a><span class="lineno">   85</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> listener_cb(<span class="keyword">struct</span> evconnlistener *listener,</div>
<div class="line"><a name="l00086"></a><span class="lineno">   86</span>&#160;                        evutil_socket_t evsocket, <span class="keyword">struct</span> sockaddr *sockaddr,</div>
<div class="line"><a name="l00087"></a><span class="lineno">   87</span>&#160;                        <span class="keywordtype">int</span> socklen, <span class="keywordtype">void</span> *userdata);</div>
<div class="line"><a name="l00088"></a><span class="lineno">   88</span>&#160;<span class="keyword">static</span> <a class="code" href="structad__conn__s.html">ad_conn_t</a> *conn_new(<a class="code" href="structad__server__s.html">ad_server_t</a> *server, <span class="keyword">struct</span> bufferevent *buffer);</div>
<div class="line"><a name="l00089"></a><span class="lineno">   89</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> conn_reset(<a class="code" href="structad__conn__s.html">ad_conn_t</a> *conn);</div>
<div class="line"><a name="l00090"></a><span class="lineno">   90</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> conn_free(<a class="code" href="structad__conn__s.html">ad_conn_t</a> *conn);</div>
<div class="line"><a name="l00091"></a><span class="lineno">   91</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> conn_read_cb(<span class="keyword">struct</span> bufferevent *buffer, <span class="keywordtype">void</span> *userdata) ;</div>
<div class="line"><a name="l00092"></a><span class="lineno">   92</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> conn_write_cb(<span class="keyword">struct</span> bufferevent *buffer, <span class="keywordtype">void</span> *userdata);</div>
<div class="line"><a name="l00093"></a><span class="lineno">   93</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> conn_event_cb(<span class="keyword">struct</span> bufferevent *buffer, <span class="keywordtype">short</span> what, <span class="keywordtype">void</span> *userdata);</div>
<div class="line"><a name="l00094"></a><span class="lineno">   94</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> conn_cb(<a class="code" href="structad__conn__s.html">ad_conn_t</a> *conn, <span class="keywordtype">int</span> event);</div>
<div class="line"><a name="l00095"></a><span class="lineno">   95</span>&#160;<span class="keyword">static</span> <span class="keywordtype">int</span> call_hooks(<span class="keywordtype">short</span> event, <a class="code" href="structad__conn__s.html">ad_conn_t</a> *conn);</div>
<div class="line"><a name="l00096"></a><span class="lineno">   96</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> *set_userdata(<a class="code" href="structad__conn__s.html">ad_conn_t</a> *conn, <span class="keywordtype">int</span> index, <span class="keyword">const</span> <span class="keywordtype">void</span> *userdata, <a class="code" href="ad__server_8h.html#a483770c2534078a7ca37b2e6590329b8">ad_userdata_free_cb</a> free_cb);</div>
<div class="line"><a name="l00097"></a><span class="lineno">   97</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> *get_userdata(<a class="code" href="structad__conn__s.html">ad_conn_t</a> *conn, <span class="keywordtype">int</span> index);</div>
<div class="line"><a name="l00098"></a><span class="lineno">   98</span>&#160;</div>
<div class="line"><a name="l00099"></a><span class="lineno">   99</span>&#160;<span class="comment">/*</span></div>
<div class="line"><a name="l00100"></a><span class="lineno">  100</span>&#160;<span class="comment"> * Local variables.</span></div>
<div class="line"><a name="l00101"></a><span class="lineno">  101</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00102"></a><span class="lineno">  102</span>&#160;<span class="keyword">static</span> <span class="keywordtype">bool</span> initialized = <span class="keyword">false</span>;</div>
<div class="line"><a name="l00103"></a><span class="lineno">  103</span>&#160;<span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00104"></a><span class="lineno">  104</span>&#160;<span class="preprocessor"></span></div>
<div class="line"><a name="l00105"></a><span class="lineno">  105</span>&#160;<span class="comment">/*</span></div>
<div class="line"><a name="l00106"></a><span class="lineno">  106</span>&#160;<span class="comment"> * Global variables.</span></div>
<div class="line"><a name="l00107"></a><span class="lineno">  107</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00108"></a><span class="lineno"><a class="line" href="ad__server_8c.html#aebeaab98b3cd2af4201083b56142eab7">  108</a></span>&#160;<span class="keywordtype">int</span> <a class="code" href="ad__server_8c.html#aebeaab98b3cd2af4201083b56142eab7">_ad_log_level</a> = <a class="code" href="ad__server_8h.html#a0fe91d344bc3f1610ea68bcec077b1c2ab705340dfe4deb52d8add04540e45b95">AD_LOG_WARN</a>;</div>
<div class="line"><a name="l00109"></a><span class="lineno">  109</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00110"></a><span class="lineno">  110</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00111"></a><span class="lineno">  111</span>&#160;<span class="comment"> * Set debug output level.</span></div>
<div class="line"><a name="l00112"></a><span class="lineno">  112</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00113"></a><span class="lineno">  113</span>&#160;<span class="comment"> * @param debug_level debug output level. 0 to disable.</span></div>
<div class="line"><a name="l00114"></a><span class="lineno">  114</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00115"></a><span class="lineno">  115</span>&#160;<span class="comment"> * @return previous debug level.</span></div>
<div class="line"><a name="l00116"></a><span class="lineno">  116</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00117"></a><span class="lineno">  117</span>&#160;<span class="comment"> * @note</span></div>
<div class="line"><a name="l00118"></a><span class="lineno">  118</span>&#160;<span class="comment"> *  debug_level:</span></div>
<div class="line"><a name="l00119"></a><span class="lineno">  119</span>&#160;<span class="comment"> *    AD_LOG_DISABLE</span></div>
<div class="line"><a name="l00120"></a><span class="lineno">  120</span>&#160;<span class="comment"> *    AD_LOG_ERROR</span></div>
<div class="line"><a name="l00121"></a><span class="lineno">  121</span>&#160;<span class="comment"> *    AD_LOG_WARN (default)</span></div>
<div class="line"><a name="l00122"></a><span class="lineno">  122</span>&#160;<span class="comment"> *    AD_LOG_INFO</span></div>
<div class="line"><a name="l00123"></a><span class="lineno">  123</span>&#160;<span class="comment"> *    AD_LOG_DEBUG</span></div>
<div class="line"><a name="l00124"></a><span class="lineno">  124</span>&#160;<span class="comment"> *    AD_LOG_DEBUG2</span></div>
<div class="line"><a name="l00125"></a><span class="lineno">  125</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00126"></a><span class="lineno"><a class="line" href="ad__server_8h.html#a1f407e2708a0c9a141d5cbeed190d73b">  126</a></span>&#160;<span class="keyword">enum</span> <a class="code" href="ad__server_8h.html#a0fe91d344bc3f1610ea68bcec077b1c2">ad_log_e</a> <a class="code" href="ad__server_8c.html#a1f407e2708a0c9a141d5cbeed190d73b">ad_log_level</a>(<span class="keyword">enum</span> <a class="code" href="ad__server_8h.html#a0fe91d344bc3f1610ea68bcec077b1c2">ad_log_e</a> log_level) {</div>
<div class="line"><a name="l00127"></a><span class="lineno">  127</span>&#160;    <span class="keywordtype">int</span> prev = <a class="code" href="ad__server_8c.html#aebeaab98b3cd2af4201083b56142eab7">_ad_log_level</a>;</div>
<div class="line"><a name="l00128"></a><span class="lineno">  128</span>&#160;    <a class="code" href="ad__server_8c.html#aebeaab98b3cd2af4201083b56142eab7">_ad_log_level</a> = log_level;</div>
<div class="line"><a name="l00129"></a><span class="lineno">  129</span>&#160;    <span class="keywordflow">return</span> prev;</div>
<div class="line"><a name="l00130"></a><span class="lineno">  130</span>&#160;}</div>
<div class="line"><a name="l00131"></a><span class="lineno">  131</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00132"></a><span class="lineno">  132</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00133"></a><span class="lineno">  133</span>&#160;<span class="comment"> * Create a server object.</span></div>
<div class="line"><a name="l00134"></a><span class="lineno">  134</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00135"></a><span class="lineno"><a class="line" href="ad__server_8h.html#a677263079eb999133e9a0be48dd2cba5">  135</a></span>&#160;<a class="code" href="structad__server__s.html">ad_server_t</a> *<a class="code" href="ad__server_8c.html#a677263079eb999133e9a0be48dd2cba5">ad_server_new</a>(<span class="keywordtype">void</span>) {</div>
<div class="line"><a name="l00136"></a><span class="lineno">  136</span>&#160;    <span class="keywordflow">if</span> (initialized) {</div>
<div class="line"><a name="l00137"></a><span class="lineno">  137</span>&#160;        initialized = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00138"></a><span class="lineno">  138</span>&#160;        <span class="comment">//evthread_use_pthreads();</span></div>
<div class="line"><a name="l00139"></a><span class="lineno">  139</span>&#160;    }</div>
<div class="line"><a name="l00140"></a><span class="lineno">  140</span>&#160;</div>
<div class="line"><a name="l00141"></a><span class="lineno">  141</span>&#160;    <a class="code" href="structad__server__s.html">ad_server_t</a> *server = NEW_OBJECT(<a class="code" href="structad__server__s.html">ad_server_t</a>);</div>
<div class="line"><a name="l00142"></a><span class="lineno">  142</span>&#160;    <span class="keywordflow">if</span> (server == NULL) {</div>
<div class="line"><a name="l00143"></a><span class="lineno">  143</span>&#160;        <span class="keywordflow">return</span> NULL;</div>
<div class="line"><a name="l00144"></a><span class="lineno">  144</span>&#160;    }</div>
<div class="line"><a name="l00145"></a><span class="lineno">  145</span>&#160;</div>
<div class="line"><a name="l00146"></a><span class="lineno">  146</span>&#160;    <span class="comment">// Initialize instance.</span></div>
<div class="line"><a name="l00147"></a><span class="lineno">  147</span>&#160;    server-&gt;<a class="code" href="structad__server__s.html#a2c75af08b7483c596b278c4c022cf9d5">options</a> = qhashtbl(0, 0);</div>
<div class="line"><a name="l00148"></a><span class="lineno">  148</span>&#160;    server-&gt;<a class="code" href="structad__server__s.html#ae8cecf112a838b40cd5b94b9b57597c0">stats</a> = qhashtbl(100, QHASHTBL_THREADSAFE);</div>
<div class="line"><a name="l00149"></a><span class="lineno">  149</span>&#160;    server-&gt;<a class="code" href="structad__server__s.html#a23ca15bb12d9df2e28bd54dbdebc9fc3">hooks</a> = qlist(0);</div>
<div class="line"><a name="l00150"></a><span class="lineno">  150</span>&#160;    <span class="keywordflow">if</span> (server-&gt;<a class="code" href="structad__server__s.html#a2c75af08b7483c596b278c4c022cf9d5">options</a> == NULL || server-&gt;<a class="code" href="structad__server__s.html#ae8cecf112a838b40cd5b94b9b57597c0">stats</a> == NULL || server-&gt;<a class="code" href="structad__server__s.html#a23ca15bb12d9df2e28bd54dbdebc9fc3">hooks</a> == NULL) {</div>
<div class="line"><a name="l00151"></a><span class="lineno">  151</span>&#160;        <a class="code" href="ad__server_8c.html#add3ea8aae949c0fa5a6bc9b0b0e1ec70">ad_server_free</a>(server);</div>
<div class="line"><a name="l00152"></a><span class="lineno">  152</span>&#160;        <span class="keywordflow">return</span> NULL;</div>
<div class="line"><a name="l00153"></a><span class="lineno">  153</span>&#160;    }</div>
<div class="line"><a name="l00154"></a><span class="lineno">  154</span>&#160;</div>
<div class="line"><a name="l00155"></a><span class="lineno">  155</span>&#160;    DEBUG(<span class="stringliteral">&quot;Created a server object.&quot;</span>);</div>
<div class="line"><a name="l00156"></a><span class="lineno">  156</span>&#160;    <span class="keywordflow">return</span> server;</div>
<div class="line"><a name="l00157"></a><span class="lineno">  157</span>&#160;}</div>
<div class="line"><a name="l00158"></a><span class="lineno">  158</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00159"></a><span class="lineno">  159</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00160"></a><span class="lineno">  160</span>&#160;<span class="comment"> * Start server.</span></div>
<div class="line"><a name="l00161"></a><span class="lineno">  161</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00162"></a><span class="lineno">  162</span>&#160;<span class="comment"> * @return 0 if successful, otherwise -1.</span></div>
<div class="line"><a name="l00163"></a><span class="lineno">  163</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00164"></a><span class="lineno"><a class="line" href="ad__server_8h.html#a75c74385ae98f9c9457534db0557d98e">  164</a></span>&#160;<span class="keywordtype">int</span> <a class="code" href="ad__server_8c.html#a75c74385ae98f9c9457534db0557d98e">ad_server_start</a>(<a class="code" href="structad__server__s.html">ad_server_t</a> *server) {</div>
<div class="line"><a name="l00165"></a><span class="lineno">  165</span>&#160;    DEBUG(<span class="stringliteral">&quot;Starting a server.&quot;</span>);</div>
<div class="line"><a name="l00166"></a><span class="lineno">  166</span>&#160;</div>
<div class="line"><a name="l00167"></a><span class="lineno">  167</span>&#160;    <span class="comment">// Set default options that were not set by user..</span></div>
<div class="line"><a name="l00168"></a><span class="lineno">  168</span>&#160;    set_undefined_options(server);</div>
<div class="line"><a name="l00169"></a><span class="lineno">  169</span>&#160;</div>
<div class="line"><a name="l00170"></a><span class="lineno">  170</span>&#160;    <span class="comment">// Hookup libevent&#39;s log message.</span></div>
<div class="line"><a name="l00171"></a><span class="lineno">  171</span>&#160;    <span class="keywordflow">if</span> (<a class="code" href="ad__server_8c.html#aebeaab98b3cd2af4201083b56142eab7">_ad_log_level</a> &gt;= <a class="code" href="ad__server_8h.html#a0fe91d344bc3f1610ea68bcec077b1c2a8812ea0ff35c50043b69112e5988e906">AD_LOG_DEBUG</a>) {</div>
<div class="line"><a name="l00172"></a><span class="lineno">  172</span>&#160;        event_set_log_callback(libevent_log_cb);</div>
<div class="line"><a name="l00173"></a><span class="lineno">  173</span>&#160;        <span class="keywordflow">if</span> (<a class="code" href="ad__server_8c.html#aebeaab98b3cd2af4201083b56142eab7">_ad_log_level</a> &gt;= <a class="code" href="ad__server_8h.html#a0fe91d344bc3f1610ea68bcec077b1c2a169716146eb4ebd68a9dfab24c9d018d">AD_LOG_DEBUG2</a>) {</div>
<div class="line"><a name="l00174"></a><span class="lineno">  174</span>&#160;            event_enable_debug_mode();</div>
<div class="line"><a name="l00175"></a><span class="lineno">  175</span>&#160;        }</div>
<div class="line"><a name="l00176"></a><span class="lineno">  176</span>&#160;    }</div>
<div class="line"><a name="l00177"></a><span class="lineno">  177</span>&#160;</div>
<div class="line"><a name="l00178"></a><span class="lineno">  178</span>&#160;    <span class="comment">// Parse addr</span></div>
<div class="line"><a name="l00179"></a><span class="lineno">  179</span>&#160;    <span class="keywordtype">int</span> port = <a class="code" href="ad__server_8c.html#a2b2e3ec49198b4d35e29a95dc9f06dad">ad_server_get_option_int</a>(server, <span class="stringliteral">&quot;server.port&quot;</span>);</div>
<div class="line"><a name="l00180"></a><span class="lineno">  180</span>&#160;    <span class="keywordtype">char</span> *addr = <a class="code" href="ad__server_8c.html#ac67bad711ee893259d4c4dc3717596ab">ad_server_get_option</a>(server, <span class="stringliteral">&quot;server.addr&quot;</span>);</div>
<div class="line"><a name="l00181"></a><span class="lineno">  181</span>&#160;    <span class="keyword">struct </span>sockaddr *sockaddr = NULL;</div>
<div class="line"><a name="l00182"></a><span class="lineno">  182</span>&#160;    <span class="keywordtype">size_t</span> sockaddr_len = 0;</div>
<div class="line"><a name="l00183"></a><span class="lineno">  183</span>&#160;    <span class="keywordflow">if</span> (addr[0] == <span class="charliteral">&#39;/&#39;</span>) {  <span class="comment">// Unix socket.</span></div>
<div class="line"><a name="l00184"></a><span class="lineno">  184</span>&#160;        <span class="keyword">struct </span>sockaddr_un unixaddr;</div>
<div class="line"><a name="l00185"></a><span class="lineno">  185</span>&#160;        bzero((<span class="keywordtype">void</span> *) &amp;unixaddr, <span class="keyword">sizeof</span>(<span class="keyword">struct</span> sockaddr_un));</div>
<div class="line"><a name="l00186"></a><span class="lineno">  186</span>&#160;        <span class="keywordflow">if</span> (strlen(addr) &gt;= <span class="keyword">sizeof</span>(unixaddr.sun_path)) {</div>
<div class="line"><a name="l00187"></a><span class="lineno">  187</span>&#160;            errno = EINVAL;</div>
<div class="line"><a name="l00188"></a><span class="lineno">  188</span>&#160;            DEBUG(<span class="stringliteral">&quot;Too long unix socket name. &#39;%s&#39;&quot;</span>, addr);</div>
<div class="line"><a name="l00189"></a><span class="lineno">  189</span>&#160;            <span class="keywordflow">return</span> -1;</div>
<div class="line"><a name="l00190"></a><span class="lineno">  190</span>&#160;        }</div>
<div class="line"><a name="l00191"></a><span class="lineno">  191</span>&#160;        unixaddr.sun_family = AF_UNIX;</div>
<div class="line"><a name="l00192"></a><span class="lineno">  192</span>&#160;        strcpy(unixaddr.sun_path, addr);  <span class="comment">// no need of strncpy()</span></div>
<div class="line"><a name="l00193"></a><span class="lineno">  193</span>&#160;        sockaddr = (<span class="keyword">struct </span>sockaddr *) &amp;unixaddr;</div>
<div class="line"><a name="l00194"></a><span class="lineno">  194</span>&#160;        sockaddr_len = <span class="keyword">sizeof</span>(unixaddr);</div>
<div class="line"><a name="l00195"></a><span class="lineno">  195</span>&#160;    } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (strstr(addr, <span class="stringliteral">&quot;:&quot;</span>)) {  <span class="comment">// IPv6</span></div>
<div class="line"><a name="l00196"></a><span class="lineno">  196</span>&#160;        <span class="keyword">struct </span>sockaddr_in6 ipv6addr;</div>
<div class="line"><a name="l00197"></a><span class="lineno">  197</span>&#160;        bzero((<span class="keywordtype">void</span> *) &amp;ipv6addr, <span class="keyword">sizeof</span>(<span class="keyword">struct</span> sockaddr_in6));</div>
<div class="line"><a name="l00198"></a><span class="lineno">  198</span>&#160;        ipv6addr.sin6_family = AF_INET6;</div>
<div class="line"><a name="l00199"></a><span class="lineno">  199</span>&#160;        ipv6addr.sin6_port = htons(port);</div>
<div class="line"><a name="l00200"></a><span class="lineno">  200</span>&#160;        evutil_inet_pton(AF_INET6, addr, &amp;ipv6addr.sin6_addr);</div>
<div class="line"><a name="l00201"></a><span class="lineno">  201</span>&#160;        sockaddr = (<span class="keyword">struct </span>sockaddr *) &amp;ipv6addr;</div>
<div class="line"><a name="l00202"></a><span class="lineno">  202</span>&#160;        sockaddr_len = <span class="keyword">sizeof</span>(ipv6addr);</div>
<div class="line"><a name="l00203"></a><span class="lineno">  203</span>&#160;    } <span class="keywordflow">else</span> {  <span class="comment">// IPv4</span></div>
<div class="line"><a name="l00204"></a><span class="lineno">  204</span>&#160;        <span class="keyword">struct </span>sockaddr_in ipv4addr;</div>
<div class="line"><a name="l00205"></a><span class="lineno">  205</span>&#160;        bzero((<span class="keywordtype">void</span> *) &amp;ipv4addr, <span class="keyword">sizeof</span>(<span class="keyword">struct</span> sockaddr_in));</div>
<div class="line"><a name="l00206"></a><span class="lineno">  206</span>&#160;        ipv4addr.sin_family = AF_INET;</div>
<div class="line"><a name="l00207"></a><span class="lineno">  207</span>&#160;        ipv4addr.sin_port = htons(port);</div>
<div class="line"><a name="l00208"></a><span class="lineno">  208</span>&#160;        ipv4addr.sin_addr.s_addr =</div>
<div class="line"><a name="l00209"></a><span class="lineno">  209</span>&#160;                (IS_EMPTY_STR(addr)) ? INADDR_ANY : inet_addr(addr);</div>
<div class="line"><a name="l00210"></a><span class="lineno">  210</span>&#160;        sockaddr = (<span class="keyword">struct </span>sockaddr *) &amp;ipv4addr;</div>
<div class="line"><a name="l00211"></a><span class="lineno">  211</span>&#160;        sockaddr_len = <span class="keyword">sizeof</span>(ipv4addr);</div>
<div class="line"><a name="l00212"></a><span class="lineno">  212</span>&#160;    }</div>
<div class="line"><a name="l00213"></a><span class="lineno">  213</span>&#160;</div>
<div class="line"><a name="l00214"></a><span class="lineno">  214</span>&#160;    <span class="comment">// SSL</span></div>
<div class="line"><a name="l00215"></a><span class="lineno">  215</span>&#160;    <span class="keywordflow">if</span> (!server-&gt;<a class="code" href="structad__server__s.html#ac49ac0bf5c97d5c0ea7443c15860dc07">sslctx</a> &amp;&amp; <a class="code" href="ad__server_8c.html#a2b2e3ec49198b4d35e29a95dc9f06dad">ad_server_get_option_int</a>(server, <span class="stringliteral">&quot;server.enable_ssl&quot;</span>)) {</div>
<div class="line"><a name="l00216"></a><span class="lineno">  216</span>&#160;        <span class="keywordtype">char</span> *cert_path = <a class="code" href="ad__server_8c.html#ac67bad711ee893259d4c4dc3717596ab">ad_server_get_option</a>(server, <span class="stringliteral">&quot;server.ssl_cert&quot;</span>);</div>
<div class="line"><a name="l00217"></a><span class="lineno">  217</span>&#160;        <span class="keywordtype">char</span> *pkey_path = <a class="code" href="ad__server_8c.html#ac67bad711ee893259d4c4dc3717596ab">ad_server_get_option</a>(server, <span class="stringliteral">&quot;server.ssl_pkey&quot;</span>);</div>
<div class="line"><a name="l00218"></a><span class="lineno">  218</span>&#160;        server-&gt;<a class="code" href="structad__server__s.html#ac49ac0bf5c97d5c0ea7443c15860dc07">sslctx</a> = init_ssl(cert_path, pkey_path);</div>
<div class="line"><a name="l00219"></a><span class="lineno">  219</span>&#160;        <span class="keywordflow">if</span> (server-&gt;<a class="code" href="structad__server__s.html#ac49ac0bf5c97d5c0ea7443c15860dc07">sslctx</a> == NULL) {</div>
<div class="line"><a name="l00220"></a><span class="lineno">  220</span>&#160;            ERROR(<span class="stringliteral">&quot;Couldn&#39;t load certificate file(%s) or private key file(%s).&quot;</span>,</div>
<div class="line"><a name="l00221"></a><span class="lineno">  221</span>&#160;                  cert_path, pkey_path);</div>
<div class="line"><a name="l00222"></a><span class="lineno">  222</span>&#160;            <span class="keywordflow">return</span> -1;</div>
<div class="line"><a name="l00223"></a><span class="lineno">  223</span>&#160;        }</div>
<div class="line"><a name="l00224"></a><span class="lineno">  224</span>&#160;        DEBUG(<span class="stringliteral">&quot;SSL Initialized.&quot;</span>);</div>
<div class="line"><a name="l00225"></a><span class="lineno">  225</span>&#160;    }</div>
<div class="line"><a name="l00226"></a><span class="lineno">  226</span>&#160;</div>
<div class="line"><a name="l00227"></a><span class="lineno">  227</span>&#160;    <span class="comment">// Bind</span></div>
<div class="line"><a name="l00228"></a><span class="lineno">  228</span>&#160;    <span class="keywordflow">if</span> (! server-&gt;<a class="code" href="structad__server__s.html#aa156a47562ec35a753d44be40c2bd155">evbase</a>) {</div>
<div class="line"><a name="l00229"></a><span class="lineno">  229</span>&#160;        server-&gt;<a class="code" href="structad__server__s.html#aa156a47562ec35a753d44be40c2bd155">evbase</a> = event_base_new();</div>
<div class="line"><a name="l00230"></a><span class="lineno">  230</span>&#160;        <span class="keywordflow">if</span> (! server-&gt;<a class="code" href="structad__server__s.html#aa156a47562ec35a753d44be40c2bd155">evbase</a>) {</div>
<div class="line"><a name="l00231"></a><span class="lineno">  231</span>&#160;            ERROR(<span class="stringliteral">&quot;Failed to create a new event base.&quot;</span>);</div>
<div class="line"><a name="l00232"></a><span class="lineno">  232</span>&#160;            <span class="keywordflow">return</span> -1;</div>
<div class="line"><a name="l00233"></a><span class="lineno">  233</span>&#160;        }</div>
<div class="line"><a name="l00234"></a><span class="lineno">  234</span>&#160;    }</div>
<div class="line"><a name="l00235"></a><span class="lineno">  235</span>&#160;</div>
<div class="line"><a name="l00236"></a><span class="lineno">  236</span>&#160;    <span class="comment">// Create a eventfd for notification channel.</span></div>
<div class="line"><a name="l00237"></a><span class="lineno">  237</span>&#160;<span class="preprocessor">#ifdef __linux__</span></div>
<div class="line"><a name="l00238"></a><span class="lineno">  238</span>&#160;<span class="preprocessor"></span>    <span class="keywordtype">int</span> notifyfd = eventfd(0, 0);</div>
<div class="line"><a name="l00239"></a><span class="lineno">  239</span>&#160;<span class="preprocessor">#else</span></div>
<div class="line"><a name="l00240"></a><span class="lineno">  240</span>&#160;<span class="preprocessor"></span>    <span class="keywordtype">int</span> notifyfd = kqueue();</div>
<div class="line"><a name="l00241"></a><span class="lineno">  241</span>&#160;<span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00242"></a><span class="lineno">  242</span>&#160;<span class="preprocessor"></span>    server-&gt;<a class="code" href="structad__server__s.html#ae17a39413f5822b4456e96b9ebd30a5d">notify_buffer</a> = bufferevent_socket_new(server-&gt;<a class="code" href="structad__server__s.html#aa156a47562ec35a753d44be40c2bd155">evbase</a>, notifyfd, BEV_OPT_CLOSE_ON_FREE);</div>
<div class="line"><a name="l00243"></a><span class="lineno">  243</span>&#160;    bufferevent_setcb(server-&gt;<a class="code" href="structad__server__s.html#ae17a39413f5822b4456e96b9ebd30a5d">notify_buffer</a>, NULL, notify_cb, NULL, server);</div>
<div class="line"><a name="l00244"></a><span class="lineno">  244</span>&#160;</div>
<div class="line"><a name="l00245"></a><span class="lineno">  245</span>&#160;    <span class="keywordflow">if</span> (! server-&gt;<a class="code" href="structad__server__s.html#ae184c2444743aa61f16b5228820087e6">listener</a>) {</div>
<div class="line"><a name="l00246"></a><span class="lineno">  246</span>&#160;        server-&gt;<a class="code" href="structad__server__s.html#ae184c2444743aa61f16b5228820087e6">listener</a> = evconnlistener_new_bind(</div>
<div class="line"><a name="l00247"></a><span class="lineno">  247</span>&#160;                server-&gt;<a class="code" href="structad__server__s.html#aa156a47562ec35a753d44be40c2bd155">evbase</a>, listener_cb, (<span class="keywordtype">void</span> *)server,</div>
<div class="line"><a name="l00248"></a><span class="lineno">  248</span>&#160;                LEV_OPT_THREADSAFE | LEV_OPT_REUSEABLE | LEV_OPT_CLOSE_ON_FREE,</div>
<div class="line"><a name="l00249"></a><span class="lineno">  249</span>&#160;                <a class="code" href="ad__server_8c.html#a2b2e3ec49198b4d35e29a95dc9f06dad">ad_server_get_option_int</a>(server, <span class="stringliteral">&quot;server.backlog&quot;</span>),</div>
<div class="line"><a name="l00250"></a><span class="lineno">  250</span>&#160;                sockaddr, sockaddr_len);</div>
<div class="line"><a name="l00251"></a><span class="lineno">  251</span>&#160;        <span class="keywordflow">if</span> (! server-&gt;<a class="code" href="structad__server__s.html#ae184c2444743aa61f16b5228820087e6">listener</a>) {</div>
<div class="line"><a name="l00252"></a><span class="lineno">  252</span>&#160;            ERROR(<span class="stringliteral">&quot;Failed to bind on %s:%d&quot;</span>, addr, port);</div>
<div class="line"><a name="l00253"></a><span class="lineno">  253</span>&#160;            <span class="keywordflow">return</span> -1;</div>
<div class="line"><a name="l00254"></a><span class="lineno">  254</span>&#160;        }</div>
<div class="line"><a name="l00255"></a><span class="lineno">  255</span>&#160;    }</div>
<div class="line"><a name="l00256"></a><span class="lineno">  256</span>&#160;</div>
<div class="line"><a name="l00257"></a><span class="lineno">  257</span>&#160;    <span class="comment">// Listen</span></div>
<div class="line"><a name="l00258"></a><span class="lineno">  258</span>&#160;    INFO(<span class="stringliteral">&quot;Listening on %s:%d%s&quot;</span>, addr, port, ((server-&gt;<a class="code" href="structad__server__s.html#ac49ac0bf5c97d5c0ea7443c15860dc07">sslctx</a>) ? <span class="stringliteral">&quot; (SSL)&quot;</span> : <span class="stringliteral">&quot;&quot;</span>));</div>
<div class="line"><a name="l00259"></a><span class="lineno">  259</span>&#160;</div>
<div class="line"><a name="l00260"></a><span class="lineno">  260</span>&#160;    <span class="keywordtype">int</span> exitstatus = 0;</div>
<div class="line"><a name="l00261"></a><span class="lineno">  261</span>&#160;    <span class="keywordflow">if</span> (<a class="code" href="ad__server_8c.html#a2b2e3ec49198b4d35e29a95dc9f06dad">ad_server_get_option_int</a>(server, <span class="stringliteral">&quot;server.thread&quot;</span>)) {</div>
<div class="line"><a name="l00262"></a><span class="lineno">  262</span>&#160;        DEBUG(<span class="stringliteral">&quot;Launching server as a thread.&quot;</span>)</div>
<div class="line"><a name="l00263"></a><span class="lineno">  263</span>&#160;        server-&gt;<a class="code" href="structad__server__s.html#ad09ee6ca2678d9e42124ae9d4b96d9fe">thread</a> = NEW_OBJECT(pthread_t);</div>
<div class="line"><a name="l00264"></a><span class="lineno">  264</span>&#160;        pthread_create(server-&gt;<a class="code" href="structad__server__s.html#ad09ee6ca2678d9e42124ae9d4b96d9fe">thread</a>, NULL, &amp;server_loop, (<span class="keywordtype">void</span> *)server);</div>
<div class="line"><a name="l00265"></a><span class="lineno">  265</span>&#160;        <span class="comment">//pthread_detach(server-&gt;thread);</span></div>
<div class="line"><a name="l00266"></a><span class="lineno">  266</span>&#160;    } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00267"></a><span class="lineno">  267</span>&#160;        <span class="keywordtype">int</span> *retval = server_loop(server);</div>
<div class="line"><a name="l00268"></a><span class="lineno">  268</span>&#160;        exitstatus = *retval;</div>
<div class="line"><a name="l00269"></a><span class="lineno">  269</span>&#160;        free(retval);</div>
<div class="line"><a name="l00270"></a><span class="lineno">  270</span>&#160;</div>
<div class="line"><a name="l00271"></a><span class="lineno">  271</span>&#160;        close_server(server);</div>
<div class="line"><a name="l00272"></a><span class="lineno">  272</span>&#160;        <span class="keywordflow">if</span> (<a class="code" href="ad__server_8c.html#a2b2e3ec49198b4d35e29a95dc9f06dad">ad_server_get_option_int</a>(server, <span class="stringliteral">&quot;server.free_on_stop&quot;</span>)) {</div>
<div class="line"><a name="l00273"></a><span class="lineno">  273</span>&#160;            <a class="code" href="ad__server_8c.html#add3ea8aae949c0fa5a6bc9b0b0e1ec70">ad_server_free</a>(server);</div>
<div class="line"><a name="l00274"></a><span class="lineno">  274</span>&#160;        }</div>
<div class="line"><a name="l00275"></a><span class="lineno">  275</span>&#160;    }</div>
<div class="line"><a name="l00276"></a><span class="lineno">  276</span>&#160;</div>
<div class="line"><a name="l00277"></a><span class="lineno">  277</span>&#160;    <span class="keywordflow">return</span> exitstatus;</div>
<div class="line"><a name="l00278"></a><span class="lineno">  278</span>&#160;}</div>
<div class="line"><a name="l00279"></a><span class="lineno">  279</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00280"></a><span class="lineno">  280</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00281"></a><span class="lineno">  281</span>&#160;<span class="comment"> * Stop server.</span></div>
<div class="line"><a name="l00282"></a><span class="lineno">  282</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00283"></a><span class="lineno">  283</span>&#160;<span class="comment"> * This call is be used to stop a server from different thread.</span></div>
<div class="line"><a name="l00284"></a><span class="lineno">  284</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00285"></a><span class="lineno">  285</span>&#160;<span class="comment"> * @return 0 if successful, otherwise -1.</span></div>
<div class="line"><a name="l00286"></a><span class="lineno">  286</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00287"></a><span class="lineno"><a class="line" href="ad__server_8h.html#a7c8229a12c31ee8a75a8099bae6dcf81">  287</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="ad__server_8c.html#a7c8229a12c31ee8a75a8099bae6dcf81">ad_server_stop</a>(<a class="code" href="structad__server__s.html">ad_server_t</a> *server) {</div>
<div class="line"><a name="l00288"></a><span class="lineno">  288</span>&#160;    DEBUG(<span class="stringliteral">&quot;Send loopexit notification.&quot;</span>);</div>
<div class="line"><a name="l00289"></a><span class="lineno">  289</span>&#160;    notify_loopexit(server);</div>
<div class="line"><a name="l00290"></a><span class="lineno">  290</span>&#160;    sleep(1);</div>
<div class="line"><a name="l00291"></a><span class="lineno">  291</span>&#160;</div>
<div class="line"><a name="l00292"></a><span class="lineno">  292</span>&#160;    <span class="keywordflow">if</span> (<a class="code" href="ad__server_8c.html#a2b2e3ec49198b4d35e29a95dc9f06dad">ad_server_get_option_int</a>(server, <span class="stringliteral">&quot;server.thread&quot;</span>)) {</div>
<div class="line"><a name="l00293"></a><span class="lineno">  293</span>&#160;        close_server(server);</div>
<div class="line"><a name="l00294"></a><span class="lineno">  294</span>&#160;        <span class="keywordflow">if</span> (<a class="code" href="ad__server_8c.html#a2b2e3ec49198b4d35e29a95dc9f06dad">ad_server_get_option_int</a>(server, <span class="stringliteral">&quot;server.free_on_stop&quot;</span>)) {</div>
<div class="line"><a name="l00295"></a><span class="lineno">  295</span>&#160;            <a class="code" href="ad__server_8c.html#add3ea8aae949c0fa5a6bc9b0b0e1ec70">ad_server_free</a>(server);</div>
<div class="line"><a name="l00296"></a><span class="lineno">  296</span>&#160;        }</div>
<div class="line"><a name="l00297"></a><span class="lineno">  297</span>&#160;    }</div>
<div class="line"><a name="l00298"></a><span class="lineno">  298</span>&#160;}</div>
<div class="line"><a name="l00299"></a><span class="lineno">  299</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00300"></a><span class="lineno">  300</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00301"></a><span class="lineno">  301</span>&#160;<span class="comment"> * Release server object and all the resources.</span></div>
<div class="line"><a name="l00302"></a><span class="lineno">  302</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00303"></a><span class="lineno"><a class="line" href="ad__server_8h.html#add3ea8aae949c0fa5a6bc9b0b0e1ec70">  303</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="ad__server_8c.html#add3ea8aae949c0fa5a6bc9b0b0e1ec70">ad_server_free</a>(<a class="code" href="structad__server__s.html">ad_server_t</a> *server) {</div>
<div class="line"><a name="l00304"></a><span class="lineno">  304</span>&#160;    <span class="keywordflow">if</span> (server == NULL) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00305"></a><span class="lineno">  305</span>&#160;</div>
<div class="line"><a name="l00306"></a><span class="lineno">  306</span>&#160;    <span class="keywordtype">int</span> thread = <a class="code" href="ad__server_8c.html#a2b2e3ec49198b4d35e29a95dc9f06dad">ad_server_get_option_int</a>(server, <span class="stringliteral">&quot;server.thread&quot;</span>);</div>
<div class="line"><a name="l00307"></a><span class="lineno">  307</span>&#160;    <span class="keywordflow">if</span> (thread &amp;&amp; server-&gt;<a class="code" href="structad__server__s.html#ad09ee6ca2678d9e42124ae9d4b96d9fe">thread</a>) {</div>
<div class="line"><a name="l00308"></a><span class="lineno">  308</span>&#160;        notify_loopexit(server);</div>
<div class="line"><a name="l00309"></a><span class="lineno">  309</span>&#160;        sleep(1);</div>
<div class="line"><a name="l00310"></a><span class="lineno">  310</span>&#160;        close_server(server);</div>
<div class="line"><a name="l00311"></a><span class="lineno">  311</span>&#160;    }</div>
<div class="line"><a name="l00312"></a><span class="lineno">  312</span>&#160;</div>
<div class="line"><a name="l00313"></a><span class="lineno">  313</span>&#160;    <span class="keywordflow">if</span> (server-&gt;<a class="code" href="structad__server__s.html#aa156a47562ec35a753d44be40c2bd155">evbase</a>) {</div>
<div class="line"><a name="l00314"></a><span class="lineno">  314</span>&#160;        event_base_free(server-&gt;<a class="code" href="structad__server__s.html#aa156a47562ec35a753d44be40c2bd155">evbase</a>);</div>
<div class="line"><a name="l00315"></a><span class="lineno">  315</span>&#160;    }</div>
<div class="line"><a name="l00316"></a><span class="lineno">  316</span>&#160;</div>
<div class="line"><a name="l00317"></a><span class="lineno">  317</span>&#160;    <span class="keywordflow">if</span> (server-&gt;<a class="code" href="structad__server__s.html#ac49ac0bf5c97d5c0ea7443c15860dc07">sslctx</a>) {</div>
<div class="line"><a name="l00318"></a><span class="lineno">  318</span>&#160;        SSL_CTX_free(server-&gt;<a class="code" href="structad__server__s.html#ac49ac0bf5c97d5c0ea7443c15860dc07">sslctx</a>);</div>
<div class="line"><a name="l00319"></a><span class="lineno">  319</span>&#160;        ERR_clear_error();</div>
<div class="line"><a name="l00320"></a><span class="lineno">  320</span>&#160;        ERR_remove_state(0);</div>
<div class="line"><a name="l00321"></a><span class="lineno">  321</span>&#160;    }</div>
<div class="line"><a name="l00322"></a><span class="lineno">  322</span>&#160;</div>
<div class="line"><a name="l00323"></a><span class="lineno">  323</span>&#160;    <span class="keywordflow">if</span> (server-&gt;<a class="code" href="structad__server__s.html#a2c75af08b7483c596b278c4c022cf9d5">options</a>) {</div>
<div class="line"><a name="l00324"></a><span class="lineno">  324</span>&#160;        server-&gt;<a class="code" href="structad__server__s.html#a2c75af08b7483c596b278c4c022cf9d5">options</a>-&gt;free(server-&gt;<a class="code" href="structad__server__s.html#a2c75af08b7483c596b278c4c022cf9d5">options</a>);</div>
<div class="line"><a name="l00325"></a><span class="lineno">  325</span>&#160;    }</div>
<div class="line"><a name="l00326"></a><span class="lineno">  326</span>&#160;    <span class="keywordflow">if</span> (server-&gt;<a class="code" href="structad__server__s.html#ae8cecf112a838b40cd5b94b9b57597c0">stats</a>) {</div>
<div class="line"><a name="l00327"></a><span class="lineno">  327</span>&#160;        server-&gt;<a class="code" href="structad__server__s.html#ae8cecf112a838b40cd5b94b9b57597c0">stats</a>-&gt;free(server-&gt;<a class="code" href="structad__server__s.html#ae8cecf112a838b40cd5b94b9b57597c0">stats</a>);</div>
<div class="line"><a name="l00328"></a><span class="lineno">  328</span>&#160;    }</div>
<div class="line"><a name="l00329"></a><span class="lineno">  329</span>&#160;    <span class="keywordflow">if</span> (server-&gt;<a class="code" href="structad__server__s.html#a23ca15bb12d9df2e28bd54dbdebc9fc3">hooks</a>) {</div>
<div class="line"><a name="l00330"></a><span class="lineno">  330</span>&#160;        qlist_t *tbl = server-&gt;<a class="code" href="structad__server__s.html#a23ca15bb12d9df2e28bd54dbdebc9fc3">hooks</a>;</div>
<div class="line"><a name="l00331"></a><span class="lineno">  331</span>&#160;        ad_hook_t *hook;</div>
<div class="line"><a name="l00332"></a><span class="lineno">  332</span>&#160;        <span class="keywordflow">while</span> ((hook = tbl-&gt;popfirst(tbl, NULL))) {</div>
<div class="line"><a name="l00333"></a><span class="lineno">  333</span>&#160;            <span class="keywordflow">if</span> (hook-&gt;method) free(hook-&gt;method);</div>
<div class="line"><a name="l00334"></a><span class="lineno">  334</span>&#160;            free(hook);</div>
<div class="line"><a name="l00335"></a><span class="lineno">  335</span>&#160;        }</div>
<div class="line"><a name="l00336"></a><span class="lineno">  336</span>&#160;        server-&gt;<a class="code" href="structad__server__s.html#a23ca15bb12d9df2e28bd54dbdebc9fc3">hooks</a>-&gt;free(server-&gt;<a class="code" href="structad__server__s.html#a23ca15bb12d9df2e28bd54dbdebc9fc3">hooks</a>);</div>
<div class="line"><a name="l00337"></a><span class="lineno">  337</span>&#160;    }</div>
<div class="line"><a name="l00338"></a><span class="lineno">  338</span>&#160;    free(server);</div>
<div class="line"><a name="l00339"></a><span class="lineno">  339</span>&#160;    DEBUG(<span class="stringliteral">&quot;Server terminated.&quot;</span>);</div>
<div class="line"><a name="l00340"></a><span class="lineno">  340</span>&#160;}</div>
<div class="line"><a name="l00341"></a><span class="lineno">  341</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00342"></a><span class="lineno">  342</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00343"></a><span class="lineno">  343</span>&#160;<span class="comment"> * Clean up all the global objects.</span></div>
<div class="line"><a name="l00344"></a><span class="lineno">  344</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00345"></a><span class="lineno">  345</span>&#160;<span class="comment"> * This will make memory-leak checkers happy.</span></div>
<div class="line"><a name="l00346"></a><span class="lineno">  346</span>&#160;<span class="comment"> * There are globally shared resources in libevent and openssl and</span></div>
<div class="line"><a name="l00347"></a><span class="lineno">  347</span>&#160;<span class="comment"> * it&#39;s usually not a problem since they don&#39;t grow but having these</span></div>
<div class="line"><a name="l00348"></a><span class="lineno">  348</span>&#160;<span class="comment"> * can confuse some debugging tools into thinking as memory leak.</span></div>
<div class="line"><a name="l00349"></a><span class="lineno">  349</span>&#160;<span class="comment"> * If you need to make sure that libasyncd has released all internal</span></div>
<div class="line"><a name="l00350"></a><span class="lineno">  350</span>&#160;<span class="comment"> * library-global data structures, call this.</span></div>
<div class="line"><a name="l00351"></a><span class="lineno">  351</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00352"></a><span class="lineno"><a class="line" href="ad__server_8h.html#ac38aa4f50412ec4e3ed0e4f9b387e115">  352</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="ad__server_8c.html#ac38aa4f50412ec4e3ed0e4f9b387e115">ad_server_global_free</a>(<span class="keywordtype">void</span>) {</div>
<div class="line"><a name="l00353"></a><span class="lineno">  353</span>&#160;    <span class="comment">// Libevent related.</span></div>
<div class="line"><a name="l00354"></a><span class="lineno">  354</span>&#160;    <span class="comment">//libevent_global_shutdown(); // From libevent v2.1</span></div>
<div class="line"><a name="l00355"></a><span class="lineno">  355</span>&#160;</div>
<div class="line"><a name="l00356"></a><span class="lineno">  356</span>&#160;    <span class="comment">// OpenSSL related.</span></div>
<div class="line"><a name="l00357"></a><span class="lineno">  357</span>&#160;    ENGINE_cleanup();</div>
<div class="line"><a name="l00358"></a><span class="lineno">  358</span>&#160;    CONF_modules_free();</div>
<div class="line"><a name="l00359"></a><span class="lineno">  359</span>&#160;    ERR_free_strings();</div>
<div class="line"><a name="l00360"></a><span class="lineno">  360</span>&#160;    EVP_cleanup();</div>
<div class="line"><a name="l00361"></a><span class="lineno">  361</span>&#160;    CRYPTO_cleanup_all_ex_data();</div>
<div class="line"><a name="l00362"></a><span class="lineno">  362</span>&#160;    sk_SSL_COMP_free(SSL_COMP_get_compression_methods());</div>
<div class="line"><a name="l00363"></a><span class="lineno">  363</span>&#160;}</div>
<div class="line"><a name="l00364"></a><span class="lineno">  364</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00365"></a><span class="lineno">  365</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00366"></a><span class="lineno">  366</span>&#160;<span class="comment"> * Set server option.</span></div>
<div class="line"><a name="l00367"></a><span class="lineno">  367</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00368"></a><span class="lineno">  368</span>&#160;<span class="comment"> * @see AD_SERVER_OPTIONS</span></div>
<div class="line"><a name="l00369"></a><span class="lineno">  369</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00370"></a><span class="lineno"><a class="line" href="ad__server_8h.html#a15edb8d7e1f406085dbf8c5a5c671bda">  370</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="ad__server_8c.html#a15edb8d7e1f406085dbf8c5a5c671bda">ad_server_set_option</a>(<a class="code" href="structad__server__s.html">ad_server_t</a> *server, <span class="keyword">const</span> <span class="keywordtype">char</span> *key, <span class="keyword">const</span> <span class="keywordtype">char</span> *value) {</div>
<div class="line"><a name="l00371"></a><span class="lineno">  371</span>&#160;    server-&gt;<a class="code" href="structad__server__s.html#a2c75af08b7483c596b278c4c022cf9d5">options</a>-&gt;putstr(server-&gt;<a class="code" href="structad__server__s.html#a2c75af08b7483c596b278c4c022cf9d5">options</a>, key, value);</div>
<div class="line"><a name="l00372"></a><span class="lineno">  372</span>&#160;}</div>
<div class="line"><a name="l00373"></a><span class="lineno">  373</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00374"></a><span class="lineno">  374</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00375"></a><span class="lineno">  375</span>&#160;<span class="comment"> * Retrieve server option.</span></div>
<div class="line"><a name="l00376"></a><span class="lineno">  376</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00377"></a><span class="lineno"><a class="line" href="ad__server_8h.html#ac67bad711ee893259d4c4dc3717596ab">  377</a></span>&#160;<span class="keywordtype">char</span> *<a class="code" href="ad__server_8c.html#ac67bad711ee893259d4c4dc3717596ab">ad_server_get_option</a>(<a class="code" href="structad__server__s.html">ad_server_t</a> *server, <span class="keyword">const</span> <span class="keywordtype">char</span> *key) {</div>
<div class="line"><a name="l00378"></a><span class="lineno">  378</span>&#160;    <span class="keywordflow">return</span> server-&gt;<a class="code" href="structad__server__s.html#a2c75af08b7483c596b278c4c022cf9d5">options</a>-&gt;getstr(server-&gt;<a class="code" href="structad__server__s.html#a2c75af08b7483c596b278c4c022cf9d5">options</a>, key, <span class="keyword">false</span>);</div>
<div class="line"><a name="l00379"></a><span class="lineno">  379</span>&#160;}</div>
<div class="line"><a name="l00380"></a><span class="lineno">  380</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00381"></a><span class="lineno">  381</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00382"></a><span class="lineno">  382</span>&#160;<span class="comment"> * Retrieve server option in integer format.</span></div>
<div class="line"><a name="l00383"></a><span class="lineno">  383</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00384"></a><span class="lineno"><a class="line" href="ad__server_8h.html#a2b2e3ec49198b4d35e29a95dc9f06dad">  384</a></span>&#160;<span class="keywordtype">int</span> <a class="code" href="ad__server_8c.html#a2b2e3ec49198b4d35e29a95dc9f06dad">ad_server_get_option_int</a>(<a class="code" href="structad__server__s.html">ad_server_t</a> *server, <span class="keyword">const</span> <span class="keywordtype">char</span> *key) {</div>
<div class="line"><a name="l00385"></a><span class="lineno">  385</span>&#160;    <span class="keywordtype">char</span> *value = <a class="code" href="ad__server_8c.html#ac67bad711ee893259d4c4dc3717596ab">ad_server_get_option</a>(server, key);</div>
<div class="line"><a name="l00386"></a><span class="lineno">  386</span>&#160;    <span class="keywordflow">return</span> (value) ? atoi(value) : 0;</div>
<div class="line"><a name="l00387"></a><span class="lineno">  387</span>&#160;}</div>
<div class="line"><a name="l00388"></a><span class="lineno">  388</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00389"></a><span class="lineno">  389</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00390"></a><span class="lineno">  390</span>&#160;<span class="comment"> * Helper method for creating minimal OpenSSL SSL_CTX object.</span></div>
<div class="line"><a name="l00391"></a><span class="lineno">  391</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00392"></a><span class="lineno">  392</span>&#160;<span class="comment"> * @param cert_path path to a PEM encoded certificate file</span></div>
<div class="line"><a name="l00393"></a><span class="lineno">  393</span>&#160;<span class="comment"> * @param pkey_path path to a PEM encoded private key file</span></div>
<div class="line"><a name="l00394"></a><span class="lineno">  394</span>&#160;<span class="comment"> * </span></div>
<div class="line"><a name="l00395"></a><span class="lineno">  395</span>&#160;<span class="comment"> * @return newly allocated SSL_CTX object or NULL on failure</span></div>
<div class="line"><a name="l00396"></a><span class="lineno">  396</span>&#160;<span class="comment"> * </span></div>
<div class="line"><a name="l00397"></a><span class="lineno">  397</span>&#160;<span class="comment"> * @note</span></div>
<div class="line"><a name="l00398"></a><span class="lineno">  398</span>&#160;<span class="comment"> * This function initializes SSL_CTX with minimum default with</span></div>
<div class="line"><a name="l00399"></a><span class="lineno">  399</span>&#160;<span class="comment"> * &quot;SSLv23_server_method&quot; which will make the server understand</span></div>
<div class="line"><a name="l00400"></a><span class="lineno">  400</span>&#160;<span class="comment"> * SSLv2, SSLv3, and TLSv1 protocol.</span></div>
<div class="line"><a name="l00401"></a><span class="lineno">  401</span>&#160;<span class="comment"> * </span></div>
<div class="line"><a name="l00402"></a><span class="lineno">  402</span>&#160;<span class="comment"> * @see ad_server_set_ssl_ctx()</span></div>
<div class="line"><a name="l00403"></a><span class="lineno">  403</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00404"></a><span class="lineno"><a class="line" href="ad__server_8h.html#ac7ad549632ecf501e170aac234703541">  404</a></span>&#160;SSL_CTX *<a class="code" href="ad__server_8c.html#ac7ad549632ecf501e170aac234703541">ad_server_ssl_ctx_create_simple</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *cert_path,</div>
<div class="line"><a name="l00405"></a><span class="lineno">  405</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">char</span> *pkey_path) {</div>
<div class="line"><a name="l00406"></a><span class="lineno">  406</span>&#160;    </div>
<div class="line"><a name="l00407"></a><span class="lineno">  407</span>&#160;    SSL_CTX *sslctx = SSL_CTX_new(SSLv23_server_method());</div>
<div class="line"><a name="l00408"></a><span class="lineno">  408</span>&#160;    <span class="keywordflow">if</span> (! SSL_CTX_use_certificate_file(sslctx, cert_path, SSL_FILETYPE_PEM) ||</div>
<div class="line"><a name="l00409"></a><span class="lineno">  409</span>&#160;        ! SSL_CTX_use_PrivateKey_file(sslctx, pkey_path, SSL_FILETYPE_PEM)) {</div>
<div class="line"><a name="l00410"></a><span class="lineno">  410</span>&#160;        </div>
<div class="line"><a name="l00411"></a><span class="lineno">  411</span>&#160;        ERROR(<span class="stringliteral">&quot;Couldn&#39;t load certificate file(%s) or private key file(%s).&quot;</span>,</div>
<div class="line"><a name="l00412"></a><span class="lineno">  412</span>&#160;              cert_path, pkey_path);</div>
<div class="line"><a name="l00413"></a><span class="lineno">  413</span>&#160;        </div>
<div class="line"><a name="l00414"></a><span class="lineno">  414</span>&#160;        <span class="keywordflow">return</span> NULL;</div>
<div class="line"><a name="l00415"></a><span class="lineno">  415</span>&#160;    }</div>
<div class="line"><a name="l00416"></a><span class="lineno">  416</span>&#160;    </div>
<div class="line"><a name="l00417"></a><span class="lineno">  417</span>&#160;    <span class="keywordflow">return</span> sslctx;</div>
<div class="line"><a name="l00418"></a><span class="lineno">  418</span>&#160;}</div>
<div class="line"><a name="l00419"></a><span class="lineno">  419</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00420"></a><span class="lineno">  420</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00421"></a><span class="lineno">  421</span>&#160;<span class="comment"> * Attach OpenSSL SSL_CTX to the server.</span></div>
<div class="line"><a name="l00422"></a><span class="lineno">  422</span>&#160;<span class="comment"> * </span></div>
<div class="line"><a name="l00423"></a><span class="lineno">  423</span>&#160;<span class="comment"> * @param server a valid server instance</span></div>
<div class="line"><a name="l00424"></a><span class="lineno">  424</span>&#160;<span class="comment"> * @param sslctx allocated and configured SSL_CTX object</span></div>
<div class="line"><a name="l00425"></a><span class="lineno">  425</span>&#160;<span class="comment"> * </span></div>
<div class="line"><a name="l00426"></a><span class="lineno">  426</span>&#160;<span class="comment"> * @note</span></div>
<div class="line"><a name="l00427"></a><span class="lineno">  427</span>&#160;<span class="comment"> * This function attached SSL_CTX object to the server causing it to</span></div>
<div class="line"><a name="l00428"></a><span class="lineno">  428</span>&#160;<span class="comment"> * communicate over SSL. Use ad_server_ssl_ctx_create_simple() to</span></div>
<div class="line"><a name="l00429"></a><span class="lineno">  429</span>&#160;<span class="comment"> * quickly create a simple SSL_CTX object or make your own with OpenSSL</span></div>
<div class="line"><a name="l00430"></a><span class="lineno">  430</span>&#160;<span class="comment"> * directly. This function must never be called when ad_server is running.</span></div>
<div class="line"><a name="l00431"></a><span class="lineno">  431</span>&#160;<span class="comment"> * </span></div>
<div class="line"><a name="l00432"></a><span class="lineno">  432</span>&#160;<span class="comment"> * @see ad_server_ssl_ctx_create_simple()</span></div>
<div class="line"><a name="l00433"></a><span class="lineno">  433</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00434"></a><span class="lineno"><a class="line" href="ad__server_8h.html#a34aa318f8a3872aa1e756adb38acd664">  434</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="ad__server_8c.html#a34aa318f8a3872aa1e756adb38acd664">ad_server_set_ssl_ctx</a>(<a class="code" href="structad__server__s.html">ad_server_t</a> *server, SSL_CTX *sslctx) {</div>
<div class="line"><a name="l00435"></a><span class="lineno">  435</span>&#160;    </div>
<div class="line"><a name="l00436"></a><span class="lineno">  436</span>&#160;    <span class="keywordflow">if</span> (server-&gt;<a class="code" href="structad__server__s.html#ac49ac0bf5c97d5c0ea7443c15860dc07">sslctx</a>) {</div>
<div class="line"><a name="l00437"></a><span class="lineno">  437</span>&#160;        SSL_CTX_free(server-&gt;<a class="code" href="structad__server__s.html#ac49ac0bf5c97d5c0ea7443c15860dc07">sslctx</a>);</div>
<div class="line"><a name="l00438"></a><span class="lineno">  438</span>&#160;    }</div>
<div class="line"><a name="l00439"></a><span class="lineno">  439</span>&#160;    </div>
<div class="line"><a name="l00440"></a><span class="lineno">  440</span>&#160;    server-&gt;<a class="code" href="structad__server__s.html#ac49ac0bf5c97d5c0ea7443c15860dc07">sslctx</a> = sslctx;</div>
<div class="line"><a name="l00441"></a><span class="lineno">  441</span>&#160;}</div>
<div class="line"><a name="l00442"></a><span class="lineno">  442</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00443"></a><span class="lineno">  443</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00444"></a><span class="lineno">  444</span>&#160;<span class="comment"> * Get OpenSSL SSL_CTX object.</span></div>
<div class="line"><a name="l00445"></a><span class="lineno">  445</span>&#160;<span class="comment"> * </span></div>
<div class="line"><a name="l00446"></a><span class="lineno">  446</span>&#160;<span class="comment"> * @param server a valid server instance</span></div>
<div class="line"><a name="l00447"></a><span class="lineno">  447</span>&#160;<span class="comment"> * @return SSL_CTX object, NULL if not enabled.</span></div>
<div class="line"><a name="l00448"></a><span class="lineno">  448</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00449"></a><span class="lineno">  449</span>&#160;<span class="comment"> * @note</span></div>
<div class="line"><a name="l00450"></a><span class="lineno">  450</span>&#160;<span class="comment"> * As a general rule the returned SSL_CTX object must not be modified</span></div>
<div class="line"><a name="l00451"></a><span class="lineno">  451</span>&#160;<span class="comment"> * while server is running as it may cause unpredictable results.</span></div>
<div class="line"><a name="l00452"></a><span class="lineno">  452</span>&#160;<span class="comment"> * However, it is safe to use it for reading SSL statistics.</span></div>
<div class="line"><a name="l00453"></a><span class="lineno">  453</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00454"></a><span class="lineno"><a class="line" href="ad__server_8h.html#addb05a5f42de5b20975a92fa69b52895">  454</a></span>&#160;SSL_CTX *<a class="code" href="ad__server_8c.html#addb05a5f42de5b20975a92fa69b52895">ad_server_get_ssl_ctx</a>(<a class="code" href="structad__server__s.html">ad_server_t</a> *server) {</div>
<div class="line"><a name="l00455"></a><span class="lineno">  455</span>&#160;    <span class="keywordflow">return</span> server-&gt;<a class="code" href="structad__server__s.html#ac49ac0bf5c97d5c0ea7443c15860dc07">sslctx</a>;</div>
<div class="line"><a name="l00456"></a><span class="lineno">  456</span>&#160;}</div>
<div class="line"><a name="l00457"></a><span class="lineno">  457</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00458"></a><span class="lineno">  458</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00459"></a><span class="lineno">  459</span>&#160;<span class="comment"> * Return internal statistic counter map.</span></div>
<div class="line"><a name="l00460"></a><span class="lineno">  460</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00461"></a><span class="lineno"><a class="line" href="ad__server_8h.html#a7fa3e3215415c9f7173f11ea1d276b8e">  461</a></span>&#160;qhashtbl_t *<a class="code" href="ad__server_8c.html#a7fa3e3215415c9f7173f11ea1d276b8e">ad_server_get_stats</a>(<a class="code" href="structad__server__s.html">ad_server_t</a> *server, <span class="keyword">const</span> <span class="keywordtype">char</span> *key) {</div>
<div class="line"><a name="l00462"></a><span class="lineno">  462</span>&#160;    <span class="keywordflow">return</span> server-&gt;<a class="code" href="structad__server__s.html#ae8cecf112a838b40cd5b94b9b57597c0">stats</a>;</div>
<div class="line"><a name="l00463"></a><span class="lineno">  463</span>&#160;}</div>
<div class="line"><a name="l00464"></a><span class="lineno">  464</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00465"></a><span class="lineno">  465</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00466"></a><span class="lineno">  466</span>&#160;<span class="comment"> * Register user hook.</span></div>
<div class="line"><a name="l00467"></a><span class="lineno">  467</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00468"></a><span class="lineno"><a class="line" href="ad__server_8h.html#aeb61485fd4f4e2f13c93871558b58025">  468</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="ad__server_8c.html#aeb61485fd4f4e2f13c93871558b58025">ad_server_register_hook</a>(<a class="code" href="structad__server__s.html">ad_server_t</a> *server, <a class="code" href="ad__server_8h.html#a659a16c6e03fa96212bff528033efc84">ad_callback</a> cb, <span class="keywordtype">void</span> *userdata) {</div>
<div class="line"><a name="l00469"></a><span class="lineno">  469</span>&#160;    <a class="code" href="ad__server_8c.html#a4c319c4143b999a1c5e4b6d17415a500">ad_server_register_hook_on_method</a>(server, NULL, cb, userdata);</div>
<div class="line"><a name="l00470"></a><span class="lineno">  470</span>&#160;}</div>
<div class="line"><a name="l00471"></a><span class="lineno">  471</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00472"></a><span class="lineno">  472</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00473"></a><span class="lineno">  473</span>&#160;<span class="comment"> * Register user hook on method name.</span></div>
<div class="line"><a name="l00474"></a><span class="lineno">  474</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00475"></a><span class="lineno"><a class="line" href="ad__server_8h.html#a4c319c4143b999a1c5e4b6d17415a500">  475</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="ad__server_8c.html#a4c319c4143b999a1c5e4b6d17415a500">ad_server_register_hook_on_method</a>(<a class="code" href="structad__server__s.html">ad_server_t</a> *server, <span class="keyword">const</span> <span class="keywordtype">char</span> *method, <a class="code" href="ad__server_8h.html#a659a16c6e03fa96212bff528033efc84">ad_callback</a> cb, <span class="keywordtype">void</span> *userdata) {</div>
<div class="line"><a name="l00476"></a><span class="lineno">  476</span>&#160;    ad_hook_t hook;</div>
<div class="line"><a name="l00477"></a><span class="lineno">  477</span>&#160;    bzero((<span class="keywordtype">void</span> *)&amp;hook, <span class="keyword">sizeof</span>(ad_hook_t));</div>
<div class="line"><a name="l00478"></a><span class="lineno">  478</span>&#160;    hook.method = (method) ? strdup(method) : NULL;</div>
<div class="line"><a name="l00479"></a><span class="lineno">  479</span>&#160;    hook.cb = cb;</div>
<div class="line"><a name="l00480"></a><span class="lineno">  480</span>&#160;    hook.userdata = userdata;</div>
<div class="line"><a name="l00481"></a><span class="lineno">  481</span>&#160;</div>
<div class="line"><a name="l00482"></a><span class="lineno">  482</span>&#160;    server-&gt;<a class="code" href="structad__server__s.html#a23ca15bb12d9df2e28bd54dbdebc9fc3">hooks</a>-&gt;addlast(server-&gt;<a class="code" href="structad__server__s.html#a23ca15bb12d9df2e28bd54dbdebc9fc3">hooks</a>, (<span class="keywordtype">void</span> *)&amp;hook, <span class="keyword">sizeof</span>(ad_hook_t));</div>
<div class="line"><a name="l00483"></a><span class="lineno">  483</span>&#160;}</div>
<div class="line"><a name="l00484"></a><span class="lineno">  484</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00485"></a><span class="lineno">  485</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00486"></a><span class="lineno">  486</span>&#160;<span class="comment"> * Attach userdata into the connection.</span></div>
<div class="line"><a name="l00487"></a><span class="lineno">  487</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00488"></a><span class="lineno">  488</span>&#160;<span class="comment"> * @return previous userdata;</span></div>
<div class="line"><a name="l00489"></a><span class="lineno">  489</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00490"></a><span class="lineno"><a class="line" href="ad__server_8h.html#a6e2e8a73baf14dafa0842b76f31765df">  490</a></span>&#160;<span class="keywordtype">void</span> *<a class="code" href="ad__server_8c.html#a6e2e8a73baf14dafa0842b76f31765df">ad_conn_set_userdata</a>(<a class="code" href="structad__conn__s.html">ad_conn_t</a> *conn, <span class="keyword">const</span> <span class="keywordtype">void</span> *userdata, <a class="code" href="ad__server_8h.html#a483770c2534078a7ca37b2e6590329b8">ad_userdata_free_cb</a> free_cb) {</div>
<div class="line"><a name="l00491"></a><span class="lineno">  491</span>&#160;    <span class="keywordflow">return</span> set_userdata(conn, 0, userdata, free_cb);</div>
<div class="line"><a name="l00492"></a><span class="lineno">  492</span>&#160;}</div>
<div class="line"><a name="l00493"></a><span class="lineno">  493</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00494"></a><span class="lineno">  494</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00495"></a><span class="lineno">  495</span>&#160;<span class="comment"> * Get userdata attached in the connection.</span></div>
<div class="line"><a name="l00496"></a><span class="lineno">  496</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00497"></a><span class="lineno">  497</span>&#160;<span class="comment"> * @return previous userdata;</span></div>
<div class="line"><a name="l00498"></a><span class="lineno">  498</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00499"></a><span class="lineno"><a class="line" href="ad__server_8h.html#ae5630244c7bb627a0561439f3cd24aca">  499</a></span>&#160;<span class="keywordtype">void</span> *<a class="code" href="ad__server_8c.html#ae5630244c7bb627a0561439f3cd24aca">ad_conn_get_userdata</a>(<a class="code" href="structad__conn__s.html">ad_conn_t</a> *conn) {</div>
<div class="line"><a name="l00500"></a><span class="lineno">  500</span>&#160;    <span class="keywordflow">return</span> get_userdata(conn, 0);</div>
<div class="line"><a name="l00501"></a><span class="lineno">  501</span>&#160;}</div>
<div class="line"><a name="l00502"></a><span class="lineno">  502</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00503"></a><span class="lineno">  503</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00504"></a><span class="lineno">  504</span>&#160;<span class="comment"> * Set extra userdata into the connection.</span></div>
<div class="line"><a name="l00505"></a><span class="lineno">  505</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00506"></a><span class="lineno">  506</span>&#160;<span class="comment"> * @return previous userdata;</span></div>
<div class="line"><a name="l00507"></a><span class="lineno">  507</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00508"></a><span class="lineno">  508</span>&#160;<span class="comment"> * @note</span></div>
<div class="line"><a name="l00509"></a><span class="lineno">  509</span>&#160;<span class="comment"> *   Extra userdata is for default protocol handler such as ad_http_handler to</span></div>
<div class="line"><a name="l00510"></a><span class="lineno">  510</span>&#160;<span class="comment"> *   provide higher abstraction. End users should always use only ad_conn_set_userdata()</span></div>
<div class="line"><a name="l00511"></a><span class="lineno">  511</span>&#160;<span class="comment"> *   to avoid any conflict with default handlers.</span></div>
<div class="line"><a name="l00512"></a><span class="lineno">  512</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00513"></a><span class="lineno"><a class="line" href="ad__server_8h.html#a5ed8e931164315ca27568958a1d70316">  513</a></span>&#160;<span class="keywordtype">void</span> *<a class="code" href="ad__server_8c.html#a5ed8e931164315ca27568958a1d70316">ad_conn_set_extra</a>(<a class="code" href="structad__conn__s.html">ad_conn_t</a> *conn, <span class="keyword">const</span> <span class="keywordtype">void</span> *extra, <a class="code" href="ad__server_8h.html#a483770c2534078a7ca37b2e6590329b8">ad_userdata_free_cb</a> free_cb) {</div>
<div class="line"><a name="l00514"></a><span class="lineno">  514</span>&#160;    <span class="keywordflow">return</span> set_userdata(conn, 1, extra, free_cb);</div>
<div class="line"><a name="l00515"></a><span class="lineno">  515</span>&#160;}</div>
<div class="line"><a name="l00516"></a><span class="lineno">  516</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00517"></a><span class="lineno">  517</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00518"></a><span class="lineno">  518</span>&#160;<span class="comment"> * Get extra userdata attached in this connection.</span></div>
<div class="line"><a name="l00519"></a><span class="lineno">  519</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00520"></a><span class="lineno"><a class="line" href="ad__server_8h.html#ad6dd41a4169cd1fcbac17462fa6b5cf8">  520</a></span>&#160;<span class="keywordtype">void</span> *<a class="code" href="ad__server_8c.html#ad6dd41a4169cd1fcbac17462fa6b5cf8">ad_conn_get_extra</a>(<a class="code" href="structad__conn__s.html">ad_conn_t</a> *conn) {</div>
<div class="line"><a name="l00521"></a><span class="lineno">  521</span>&#160;    <span class="keywordflow">return</span> get_userdata(conn, 1);</div>
<div class="line"><a name="l00522"></a><span class="lineno">  522</span>&#160;}</div>
<div class="line"><a name="l00523"></a><span class="lineno">  523</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00524"></a><span class="lineno">  524</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00525"></a><span class="lineno">  525</span>&#160;<span class="comment"> * Set method name on this connection.</span></div>
<div class="line"><a name="l00526"></a><span class="lineno">  526</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00527"></a><span class="lineno">  527</span>&#160;<span class="comment"> * Once the method name is set, hooks registered by ad_server_register_hook_on_method()</span></div>
<div class="line"><a name="l00528"></a><span class="lineno">  528</span>&#160;<span class="comment"> * will be called if method name matches with the registered name.</span></div>
<div class="line"><a name="l00529"></a><span class="lineno">  529</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00530"></a><span class="lineno">  530</span>&#160;<span class="comment"> * @see ad_server_register_hook_on_method()</span></div>
<div class="line"><a name="l00531"></a><span class="lineno">  531</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00532"></a><span class="lineno"><a class="line" href="ad__server_8h.html#aef5876145774e9c6d38e68c06d05e34c">  532</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="ad__server_8c.html#aef5876145774e9c6d38e68c06d05e34c">ad_conn_set_method</a>(<a class="code" href="structad__conn__s.html">ad_conn_t</a> *conn, <span class="keywordtype">char</span> *method) {</div>
<div class="line"><a name="l00533"></a><span class="lineno">  533</span>&#160;    <span class="keywordtype">char</span> *prev = conn-&gt;<a class="code" href="structad__conn__s.html#a3d78c01960c23c9a5db3216a74d903b5">method</a>;</div>
<div class="line"><a name="l00534"></a><span class="lineno">  534</span>&#160;    conn-&gt;<a class="code" href="structad__conn__s.html#a3d78c01960c23c9a5db3216a74d903b5">method</a> = (method != NULL) ? strdup(method) : NULL;</div>
<div class="line"><a name="l00535"></a><span class="lineno">  535</span>&#160;    <span class="keywordflow">if</span> (prev) {</div>
<div class="line"><a name="l00536"></a><span class="lineno">  536</span>&#160;        free(prev);</div>
<div class="line"><a name="l00537"></a><span class="lineno">  537</span>&#160;    }</div>
<div class="line"><a name="l00538"></a><span class="lineno">  538</span>&#160;}</div>
<div class="line"><a name="l00539"></a><span class="lineno">  539</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00540"></a><span class="lineno">  540</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00541"></a><span class="lineno">  541</span>&#160;<span class="comment"> * Return socket file descriptor associated with a connection.</span></div>
<div class="line"><a name="l00542"></a><span class="lineno">  542</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00543"></a><span class="lineno"><a class="line" href="ad__server_8h.html#a5ba67b542d4ba48ad4a25280d10ef86f">  543</a></span>&#160;<span class="keywordtype">int</span> <a class="code" href="ad__server_8c.html#a5ba67b542d4ba48ad4a25280d10ef86f">ad_conn_get_socket</a>(<a class="code" href="structad__conn__s.html">ad_conn_t</a> *conn) {</div>
<div class="line"><a name="l00544"></a><span class="lineno">  544</span>&#160;    <span class="keywordflow">return</span> bufferevent_getfd(conn-&gt;<a class="code" href="structad__conn__s.html#a2e3de19cb9eea56002d5adec7fad66cf">buffer</a>);</div>
<div class="line"><a name="l00545"></a><span class="lineno">  545</span>&#160;}</div>
<div class="line"><a name="l00546"></a><span class="lineno">  546</span>&#160;</div>
<div class="line"><a name="l00547"></a><span class="lineno">  547</span>&#160;<span class="comment">/******************************************************************************</span></div>
<div class="line"><a name="l00548"></a><span class="lineno">  548</span>&#160;<span class="comment"> * Private internal functions.</span></div>
<div class="line"><a name="l00549"></a><span class="lineno">  549</span>&#160;<span class="comment"> *****************************************************************************/</span></div>
<div class="line"><a name="l00550"></a><span class="lineno">  550</span>&#160;<span class="preprocessor">#ifndef _DOXYGEN_SKIP</span></div>
<div class="line"><a name="l00551"></a><span class="lineno">  551</span>&#160;<span class="preprocessor"></span><span class="comment"></span></div>
<div class="line"><a name="l00552"></a><span class="lineno">  552</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00553"></a><span class="lineno">  553</span>&#160;<span class="comment"> * If there&#39;s no event, loopbreak or loopexit call won&#39;t work until one more</span></div>
<div class="line"><a name="l00554"></a><span class="lineno">  554</span>&#160;<span class="comment"> * event arrived. So we use eventfd as a internal notification channel to let</span></div>
<div class="line"><a name="l00555"></a><span class="lineno">  555</span>&#160;<span class="comment"> * server get out of the loop without waiting for an event.</span></div>
<div class="line"><a name="l00556"></a><span class="lineno">  556</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00557"></a><span class="lineno">  557</span>&#160;<span class="keyword">static</span> <span class="keywordtype">int</span> notify_loopexit(<a class="code" href="structad__server__s.html">ad_server_t</a> *server) {</div>
<div class="line"><a name="l00558"></a><span class="lineno">  558</span>&#160;    uint64_t x = 0;</div>
<div class="line"><a name="l00559"></a><span class="lineno">  559</span>&#160;    <span class="keywordflow">return</span> bufferevent_write(server-&gt;<a class="code" href="structad__server__s.html#ae17a39413f5822b4456e96b9ebd30a5d">notify_buffer</a>, &amp;x, <span class="keyword">sizeof</span>(uint64_t));</div>
<div class="line"><a name="l00560"></a><span class="lineno">  560</span>&#160;}</div>
<div class="line"><a name="l00561"></a><span class="lineno">  561</span>&#160;</div>
<div class="line"><a name="l00562"></a><span class="lineno">  562</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> notify_cb(<span class="keyword">struct</span> bufferevent *buffer, <span class="keywordtype">void</span> *userdata) {</div>
<div class="line"><a name="l00563"></a><span class="lineno">  563</span>&#160;    <a class="code" href="structad__server__s.html">ad_server_t</a> *server = (<a class="code" href="structad__server__s.html">ad_server_t</a> *)userdata;</div>
<div class="line"><a name="l00564"></a><span class="lineno">  564</span>&#160;    event_base_loopexit(server-&gt;<a class="code" href="structad__server__s.html#aa156a47562ec35a753d44be40c2bd155">evbase</a>, NULL);</div>
<div class="line"><a name="l00565"></a><span class="lineno">  565</span>&#160;    DEBUG(<span class="stringliteral">&quot;Existing loop.&quot;</span>);</div>
<div class="line"><a name="l00566"></a><span class="lineno">  566</span>&#160;}</div>
<div class="line"><a name="l00567"></a><span class="lineno">  567</span>&#160;</div>
<div class="line"><a name="l00568"></a><span class="lineno">  568</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> *server_loop(<span class="keywordtype">void</span> *instance) {</div>
<div class="line"><a name="l00569"></a><span class="lineno">  569</span>&#160;    <a class="code" href="structad__server__s.html">ad_server_t</a> *server = (<a class="code" href="structad__server__s.html">ad_server_t</a> *)instance;</div>
<div class="line"><a name="l00570"></a><span class="lineno">  570</span>&#160;</div>
<div class="line"><a name="l00571"></a><span class="lineno">  571</span>&#160;    <span class="keywordtype">int</span> *retval = NEW_OBJECT(<span class="keywordtype">int</span>);</div>
<div class="line"><a name="l00572"></a><span class="lineno">  572</span>&#160;    DEBUG(<span class="stringliteral">&quot;Loop start&quot;</span>);</div>
<div class="line"><a name="l00573"></a><span class="lineno">  573</span>&#160;    event_base_loop(server-&gt;<a class="code" href="structad__server__s.html#aa156a47562ec35a753d44be40c2bd155">evbase</a>, 0);</div>
<div class="line"><a name="l00574"></a><span class="lineno">  574</span>&#160;    DEBUG(<span class="stringliteral">&quot;Loop finished&quot;</span>);</div>
<div class="line"><a name="l00575"></a><span class="lineno">  575</span>&#160;    *retval = (event_base_got_break(server-&gt;<a class="code" href="structad__server__s.html#aa156a47562ec35a753d44be40c2bd155">evbase</a>)) ? -1 : 0;</div>
<div class="line"><a name="l00576"></a><span class="lineno">  576</span>&#160;</div>
<div class="line"><a name="l00577"></a><span class="lineno">  577</span>&#160;    <span class="keywordflow">return</span> retval;</div>
<div class="line"><a name="l00578"></a><span class="lineno">  578</span>&#160;}</div>
<div class="line"><a name="l00579"></a><span class="lineno">  579</span>&#160;</div>
<div class="line"><a name="l00580"></a><span class="lineno">  580</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> close_server(<a class="code" href="structad__server__s.html">ad_server_t</a> *server) {</div>
<div class="line"><a name="l00581"></a><span class="lineno">  581</span>&#160;    DEBUG(<span class="stringliteral">&quot;Closing server.&quot;</span>);</div>
<div class="line"><a name="l00582"></a><span class="lineno">  582</span>&#160;</div>
<div class="line"><a name="l00583"></a><span class="lineno">  583</span>&#160;    <span class="keywordflow">if</span> (server-&gt;<a class="code" href="structad__server__s.html#ae17a39413f5822b4456e96b9ebd30a5d">notify_buffer</a>) {</div>
<div class="line"><a name="l00584"></a><span class="lineno">  584</span>&#160;        bufferevent_free(server-&gt;<a class="code" href="structad__server__s.html#ae17a39413f5822b4456e96b9ebd30a5d">notify_buffer</a>);</div>
<div class="line"><a name="l00585"></a><span class="lineno">  585</span>&#160;        server-&gt;<a class="code" href="structad__server__s.html#ae17a39413f5822b4456e96b9ebd30a5d">notify_buffer</a> = NULL;</div>
<div class="line"><a name="l00586"></a><span class="lineno">  586</span>&#160;    }</div>
<div class="line"><a name="l00587"></a><span class="lineno">  587</span>&#160;</div>
<div class="line"><a name="l00588"></a><span class="lineno">  588</span>&#160;    <span class="keywordflow">if</span> (server-&gt;<a class="code" href="structad__server__s.html#ae184c2444743aa61f16b5228820087e6">listener</a>) {</div>
<div class="line"><a name="l00589"></a><span class="lineno">  589</span>&#160;            evconnlistener_free(server-&gt;<a class="code" href="structad__server__s.html#ae184c2444743aa61f16b5228820087e6">listener</a>);</div>
<div class="line"><a name="l00590"></a><span class="lineno">  590</span>&#160;            server-&gt;<a class="code" href="structad__server__s.html#ae184c2444743aa61f16b5228820087e6">listener</a> = NULL;</div>
<div class="line"><a name="l00591"></a><span class="lineno">  591</span>&#160;    }</div>
<div class="line"><a name="l00592"></a><span class="lineno">  592</span>&#160;</div>
<div class="line"><a name="l00593"></a><span class="lineno">  593</span>&#160;    <span class="keywordflow">if</span> (server-&gt;<a class="code" href="structad__server__s.html#ad09ee6ca2678d9e42124ae9d4b96d9fe">thread</a>) {</div>
<div class="line"><a name="l00594"></a><span class="lineno">  594</span>&#160;        <span class="keywordtype">void</span> *retval = NULL;</div>
<div class="line"><a name="l00595"></a><span class="lineno">  595</span>&#160;        DEBUG(<span class="stringliteral">&quot;Waiting server&#39;s last loop to finish.&quot;</span>);</div>
<div class="line"><a name="l00596"></a><span class="lineno">  596</span>&#160;        pthread_join(*(server-&gt;<a class="code" href="structad__server__s.html#ad09ee6ca2678d9e42124ae9d4b96d9fe">thread</a>), &amp;retval);</div>
<div class="line"><a name="l00597"></a><span class="lineno">  597</span>&#160;        free(retval);</div>
<div class="line"><a name="l00598"></a><span class="lineno">  598</span>&#160;        free(server-&gt;<a class="code" href="structad__server__s.html#ad09ee6ca2678d9e42124ae9d4b96d9fe">thread</a>);</div>
<div class="line"><a name="l00599"></a><span class="lineno">  599</span>&#160;        server-&gt;<a class="code" href="structad__server__s.html#ad09ee6ca2678d9e42124ae9d4b96d9fe">thread</a> = NULL;</div>
<div class="line"><a name="l00600"></a><span class="lineno">  600</span>&#160;    }</div>
<div class="line"><a name="l00601"></a><span class="lineno">  601</span>&#160;    INFO(<span class="stringliteral">&quot;Server closed.&quot;</span>);</div>
<div class="line"><a name="l00602"></a><span class="lineno">  602</span>&#160;}</div>
<div class="line"><a name="l00603"></a><span class="lineno">  603</span>&#160;</div>
<div class="line"><a name="l00604"></a><span class="lineno">  604</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> libevent_log_cb(<span class="keywordtype">int</span> severity, <span class="keyword">const</span> <span class="keywordtype">char</span> *msg) {</div>
<div class="line"><a name="l00605"></a><span class="lineno">  605</span>&#160;    <span class="keywordflow">switch</span>(severity) {</div>
<div class="line"><a name="l00606"></a><span class="lineno">  606</span>&#160;        <span class="keywordflow">case</span> _EVENT_LOG_MSG : {</div>
<div class="line"><a name="l00607"></a><span class="lineno">  607</span>&#160;            INFO(<span class="stringliteral">&quot;%s&quot;</span>, msg);</div>
<div class="line"><a name="l00608"></a><span class="lineno">  608</span>&#160;            <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00609"></a><span class="lineno">  609</span>&#160;        }</div>
<div class="line"><a name="l00610"></a><span class="lineno">  610</span>&#160;        <span class="keywordflow">case</span> _EVENT_LOG_WARN : {</div>
<div class="line"><a name="l00611"></a><span class="lineno">  611</span>&#160;            WARN(<span class="stringliteral">&quot;%s&quot;</span>, msg);</div>
<div class="line"><a name="l00612"></a><span class="lineno">  612</span>&#160;            <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00613"></a><span class="lineno">  613</span>&#160;        }</div>
<div class="line"><a name="l00614"></a><span class="lineno">  614</span>&#160;        <span class="keywordflow">case</span> _EVENT_LOG_ERR : {</div>
<div class="line"><a name="l00615"></a><span class="lineno">  615</span>&#160;            ERROR(<span class="stringliteral">&quot;%s&quot;</span>, msg);</div>
<div class="line"><a name="l00616"></a><span class="lineno">  616</span>&#160;            <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00617"></a><span class="lineno">  617</span>&#160;        }</div>
<div class="line"><a name="l00618"></a><span class="lineno">  618</span>&#160;        <span class="keywordflow">default</span> : {</div>
<div class="line"><a name="l00619"></a><span class="lineno">  619</span>&#160;            DEBUG(<span class="stringliteral">&quot;%s&quot;</span>, msg);</div>
<div class="line"><a name="l00620"></a><span class="lineno">  620</span>&#160;            <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00621"></a><span class="lineno">  621</span>&#160;        }</div>
<div class="line"><a name="l00622"></a><span class="lineno">  622</span>&#160;    }</div>
<div class="line"><a name="l00623"></a><span class="lineno">  623</span>&#160;}</div>
<div class="line"><a name="l00624"></a><span class="lineno">  624</span>&#160;</div>
<div class="line"><a name="l00625"></a><span class="lineno">  625</span>&#160;<span class="comment">// Set default options that were not set by user..</span></div>
<div class="line"><a name="l00626"></a><span class="lineno">  626</span>&#160;<span class="keyword">static</span> <span class="keywordtype">int</span> set_undefined_options(<a class="code" href="structad__server__s.html">ad_server_t</a> *server) {</div>
<div class="line"><a name="l00627"></a><span class="lineno">  627</span>&#160;    <span class="keywordtype">int</span> newentries = 0;</div>
<div class="line"><a name="l00628"></a><span class="lineno">  628</span>&#160;    <span class="keywordtype">char</span> *default_options[][2] = <a class="code" href="ad__server_8h.html#adc215edc66db6333bb058fb84ed332ca">AD_SERVER_OPTIONS</a>;</div>
<div class="line"><a name="l00629"></a><span class="lineno">  629</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; ! IS_EMPTY_STR(default_options[i][0]); i++) {</div>
<div class="line"><a name="l00630"></a><span class="lineno">  630</span>&#160;        <span class="keywordflow">if</span> (! <a class="code" href="ad__server_8c.html#ac67bad711ee893259d4c4dc3717596ab">ad_server_get_option</a>(server, default_options[i][0])) {</div>
<div class="line"><a name="l00631"></a><span class="lineno">  631</span>&#160;            <a class="code" href="ad__server_8c.html#a15edb8d7e1f406085dbf8c5a5c671bda">ad_server_set_option</a>(server, default_options[i][0], default_options[i][1]);</div>
<div class="line"><a name="l00632"></a><span class="lineno">  632</span>&#160;            newentries++;</div>
<div class="line"><a name="l00633"></a><span class="lineno">  633</span>&#160;        }</div>
<div class="line"><a name="l00634"></a><span class="lineno">  634</span>&#160;        DEBUG(<span class="stringliteral">&quot;%s=%s&quot;</span>, default_options[i][0], <a class="code" href="ad__server_8c.html#ac67bad711ee893259d4c4dc3717596ab">ad_server_get_option</a>(server, default_options[i][0]));</div>
<div class="line"><a name="l00635"></a><span class="lineno">  635</span>&#160;    }</div>
<div class="line"><a name="l00636"></a><span class="lineno">  636</span>&#160;    <span class="keywordflow">return</span> newentries;</div>
<div class="line"><a name="l00637"></a><span class="lineno">  637</span>&#160;}</div>
<div class="line"><a name="l00638"></a><span class="lineno">  638</span>&#160;</div>
<div class="line"><a name="l00639"></a><span class="lineno">  639</span>&#160;<span class="keyword">static</span> SSL_CTX *init_ssl(<span class="keyword">const</span> <span class="keywordtype">char</span> *cert_path, <span class="keyword">const</span> <span class="keywordtype">char</span> *pkey_path) {</div>
<div class="line"><a name="l00640"></a><span class="lineno">  640</span>&#160;    SSL_CTX *sslctx = SSL_CTX_new(SSLv23_server_method());</div>
<div class="line"><a name="l00641"></a><span class="lineno">  641</span>&#160;    <span class="keywordflow">if</span> (! SSL_CTX_use_certificate_file(sslctx, cert_path, SSL_FILETYPE_PEM) ||</div>
<div class="line"><a name="l00642"></a><span class="lineno">  642</span>&#160;        ! SSL_CTX_use_PrivateKey_file(sslctx, pkey_path, SSL_FILETYPE_PEM)) {</div>
<div class="line"><a name="l00643"></a><span class="lineno">  643</span>&#160;        <span class="keywordflow">return</span> NULL;</div>
<div class="line"><a name="l00644"></a><span class="lineno">  644</span>&#160;    }</div>
<div class="line"><a name="l00645"></a><span class="lineno">  645</span>&#160;    <span class="keywordflow">return</span> sslctx;</div>
<div class="line"><a name="l00646"></a><span class="lineno">  646</span>&#160;}</div>
<div class="line"><a name="l00647"></a><span class="lineno">  647</span>&#160;</div>
<div class="line"><a name="l00648"></a><span class="lineno">  648</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> listener_cb(<span class="keyword">struct</span> evconnlistener *listener, evutil_socket_t socket,</div>
<div class="line"><a name="l00649"></a><span class="lineno">  649</span>&#160;                        <span class="keyword">struct</span> sockaddr *sockaddr, <span class="keywordtype">int</span> socklen, <span class="keywordtype">void</span> *userdata) {</div>
<div class="line"><a name="l00650"></a><span class="lineno">  650</span>&#160;    DEBUG(<span class="stringliteral">&quot;New connection.&quot;</span>);</div>
<div class="line"><a name="l00651"></a><span class="lineno">  651</span>&#160;    <a class="code" href="structad__server__s.html">ad_server_t</a> *server = (<a class="code" href="structad__server__s.html">ad_server_t</a> *)userdata;</div>
<div class="line"><a name="l00652"></a><span class="lineno">  652</span>&#160;</div>
<div class="line"><a name="l00653"></a><span class="lineno">  653</span>&#160;    <span class="comment">// Create a new buffer.</span></div>
<div class="line"><a name="l00654"></a><span class="lineno">  654</span>&#160;    <span class="keyword">struct </span>bufferevent *buffer = NULL;</div>
<div class="line"><a name="l00655"></a><span class="lineno">  655</span>&#160;    <span class="keywordflow">if</span> (server-&gt;<a class="code" href="structad__server__s.html#ac49ac0bf5c97d5c0ea7443c15860dc07">sslctx</a>) {</div>
<div class="line"><a name="l00656"></a><span class="lineno">  656</span>&#160;        buffer = bufferevent_openssl_socket_new(server-&gt;<a class="code" href="structad__server__s.html#aa156a47562ec35a753d44be40c2bd155">evbase</a>, socket,</div>
<div class="line"><a name="l00657"></a><span class="lineno">  657</span>&#160;                                                SSL_new(server-&gt;<a class="code" href="structad__server__s.html#ac49ac0bf5c97d5c0ea7443c15860dc07">sslctx</a>),</div>
<div class="line"><a name="l00658"></a><span class="lineno">  658</span>&#160;                                                BUFFEREVENT_SSL_ACCEPTING,</div>
<div class="line"><a name="l00659"></a><span class="lineno">  659</span>&#160;                                                BEV_OPT_CLOSE_ON_FREE);</div>
<div class="line"><a name="l00660"></a><span class="lineno">  660</span>&#160;    } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00661"></a><span class="lineno">  661</span>&#160;        buffer = bufferevent_socket_new(server-&gt;<a class="code" href="structad__server__s.html#aa156a47562ec35a753d44be40c2bd155">evbase</a>, socket, BEV_OPT_CLOSE_ON_FREE);</div>
<div class="line"><a name="l00662"></a><span class="lineno">  662</span>&#160;    }</div>
<div class="line"><a name="l00663"></a><span class="lineno">  663</span>&#160;    <span class="keywordflow">if</span> (buffer == NULL) <span class="keywordflow">goto</span> error;</div>
<div class="line"><a name="l00664"></a><span class="lineno">  664</span>&#160;</div>
<div class="line"><a name="l00665"></a><span class="lineno">  665</span>&#160;    <span class="comment">// Set read timeout.</span></div>
<div class="line"><a name="l00666"></a><span class="lineno">  666</span>&#160;    <span class="keywordtype">int</span> timeout = <a class="code" href="ad__server_8c.html#a2b2e3ec49198b4d35e29a95dc9f06dad">ad_server_get_option_int</a>(server, <span class="stringliteral">&quot;server.timeout&quot;</span>);</div>
<div class="line"><a name="l00667"></a><span class="lineno">  667</span>&#160;    <span class="keywordflow">if</span> (timeout &gt; 0) {</div>
<div class="line"><a name="l00668"></a><span class="lineno">  668</span>&#160;        <span class="keyword">struct </span>timeval tm;</div>
<div class="line"><a name="l00669"></a><span class="lineno">  669</span>&#160;        bzero((<span class="keywordtype">void</span> *)&amp;tm, <span class="keyword">sizeof</span>(<span class="keyword">struct</span> timeval));</div>
<div class="line"><a name="l00670"></a><span class="lineno">  670</span>&#160;        tm.tv_sec = timeout;</div>
<div class="line"><a name="l00671"></a><span class="lineno">  671</span>&#160;        bufferevent_set_timeouts(buffer, &amp;tm, NULL);</div>
<div class="line"><a name="l00672"></a><span class="lineno">  672</span>&#160;    }</div>
<div class="line"><a name="l00673"></a><span class="lineno">  673</span>&#160;</div>
<div class="line"><a name="l00674"></a><span class="lineno">  674</span>&#160;    <span class="comment">// Create a connection.</span></div>
<div class="line"><a name="l00675"></a><span class="lineno">  675</span>&#160;    <span class="keywordtype">void</span> *conn = conn_new(server, buffer);</div>
<div class="line"><a name="l00676"></a><span class="lineno">  676</span>&#160;    <span class="keywordflow">if</span> (! conn) <span class="keywordflow">goto</span> error;</div>
<div class="line"><a name="l00677"></a><span class="lineno">  677</span>&#160;</div>
<div class="line"><a name="l00678"></a><span class="lineno">  678</span>&#160;    <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00679"></a><span class="lineno">  679</span>&#160;</div>
<div class="line"><a name="l00680"></a><span class="lineno">  680</span>&#160;  error:</div>
<div class="line"><a name="l00681"></a><span class="lineno">  681</span>&#160;    <span class="keywordflow">if</span> (buffer) bufferevent_free(buffer);</div>
<div class="line"><a name="l00682"></a><span class="lineno">  682</span>&#160;    ERROR(<span class="stringliteral">&quot;Failed to create a connection handler.&quot;</span>);</div>
<div class="line"><a name="l00683"></a><span class="lineno">  683</span>&#160;    event_base_loopbreak(server-&gt;<a class="code" href="structad__server__s.html#aa156a47562ec35a753d44be40c2bd155">evbase</a>);</div>
<div class="line"><a name="l00684"></a><span class="lineno">  684</span>&#160;    server-&gt;<a class="code" href="structad__server__s.html#ac0c82aed3c82235b3788796bc7a83e0b">errcode</a> = ENOMEM;</div>
<div class="line"><a name="l00685"></a><span class="lineno">  685</span>&#160;}</div>
<div class="line"><a name="l00686"></a><span class="lineno">  686</span>&#160;</div>
<div class="line"><a name="l00687"></a><span class="lineno">  687</span>&#160;<span class="keyword">static</span> <a class="code" href="structad__conn__s.html">ad_conn_t</a> *conn_new(<a class="code" href="structad__server__s.html">ad_server_t</a> *server, <span class="keyword">struct</span> bufferevent *buffer) {</div>
<div class="line"><a name="l00688"></a><span class="lineno">  688</span>&#160;    <span class="keywordflow">if</span> (server == NULL || buffer == NULL) {</div>
<div class="line"><a name="l00689"></a><span class="lineno">  689</span>&#160;        <span class="keywordflow">return</span> NULL;</div>
<div class="line"><a name="l00690"></a><span class="lineno">  690</span>&#160;    }</div>
<div class="line"><a name="l00691"></a><span class="lineno">  691</span>&#160;</div>
<div class="line"><a name="l00692"></a><span class="lineno">  692</span>&#160;    <span class="comment">// Create a new connection container.</span></div>
<div class="line"><a name="l00693"></a><span class="lineno">  693</span>&#160;    <a class="code" href="structad__conn__s.html">ad_conn_t</a> *conn = NEW_OBJECT(<a class="code" href="structad__conn__s.html">ad_conn_t</a>);</div>
<div class="line"><a name="l00694"></a><span class="lineno">  694</span>&#160;    <span class="keywordflow">if</span> (conn == NULL) <span class="keywordflow">return</span> NULL;</div>
<div class="line"><a name="l00695"></a><span class="lineno">  695</span>&#160;</div>
<div class="line"><a name="l00696"></a><span class="lineno">  696</span>&#160;    <span class="comment">// Initialize with default values.</span></div>
<div class="line"><a name="l00697"></a><span class="lineno">  697</span>&#160;    conn-&gt;<a class="code" href="structad__conn__s.html#abb9074b951a064f2790c154475c19fa8">server</a> = server;</div>
<div class="line"><a name="l00698"></a><span class="lineno">  698</span>&#160;    conn-&gt;<a class="code" href="structad__conn__s.html#a2e3de19cb9eea56002d5adec7fad66cf">buffer</a> = buffer;</div>
<div class="line"><a name="l00699"></a><span class="lineno">  699</span>&#160;    conn-&gt;<a class="code" href="structad__conn__s.html#a0c33794bef5cb9c633c09026173f64cd">in</a> = bufferevent_get_input(buffer);</div>
<div class="line"><a name="l00700"></a><span class="lineno">  700</span>&#160;    conn-&gt;<a class="code" href="structad__conn__s.html#a30d7905f017359ece17a8c7406fc20fc">out</a> = bufferevent_get_output(buffer);</div>
<div class="line"><a name="l00701"></a><span class="lineno">  701</span>&#160;    conn_reset(conn);</div>
<div class="line"><a name="l00702"></a><span class="lineno">  702</span>&#160;</div>
<div class="line"><a name="l00703"></a><span class="lineno">  703</span>&#160;    <span class="comment">// Bind callback</span></div>
<div class="line"><a name="l00704"></a><span class="lineno">  704</span>&#160;    bufferevent_setcb(buffer, conn_read_cb, conn_write_cb, conn_event_cb, (<span class="keywordtype">void</span> *)conn);</div>
<div class="line"><a name="l00705"></a><span class="lineno">  705</span>&#160;    bufferevent_setwatermark(buffer, EV_WRITE, 0, 0);</div>
<div class="line"><a name="l00706"></a><span class="lineno">  706</span>&#160;    bufferevent_enable(buffer, EV_WRITE);</div>
<div class="line"><a name="l00707"></a><span class="lineno">  707</span>&#160;    bufferevent_enable(buffer, EV_READ);</div>
<div class="line"><a name="l00708"></a><span class="lineno">  708</span>&#160;</div>
<div class="line"><a name="l00709"></a><span class="lineno">  709</span>&#160;    <span class="comment">// Run callbacks with AD_EVENT_INIT event.</span></div>
<div class="line"><a name="l00710"></a><span class="lineno">  710</span>&#160;    conn-&gt;<a class="code" href="structad__conn__s.html#a9b7fa3872345cd7caa315e401b7d8f7d">status</a> = call_hooks(<a class="code" href="ad__server_8h.html#afcba550cce3f169b37f718e3a6a7a20c">AD_EVENT_INIT</a> | <a class="code" href="ad__server_8h.html#a7ba189c66b4487ee0659d4b4e362ba4f">AD_EVENT_WRITE</a>, conn);</div>
<div class="line"><a name="l00711"></a><span class="lineno">  711</span>&#160;</div>
<div class="line"><a name="l00712"></a><span class="lineno">  712</span>&#160;    <span class="keywordflow">return</span> conn;</div>
<div class="line"><a name="l00713"></a><span class="lineno">  713</span>&#160;}</div>
<div class="line"><a name="l00714"></a><span class="lineno">  714</span>&#160;</div>
<div class="line"><a name="l00715"></a><span class="lineno">  715</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> conn_reset(<a class="code" href="structad__conn__s.html">ad_conn_t</a> *conn) {</div>
<div class="line"><a name="l00716"></a><span class="lineno">  716</span>&#160;    conn-&gt;<a class="code" href="structad__conn__s.html#a9b7fa3872345cd7caa315e401b7d8f7d">status</a> = <a class="code" href="ad__server_8h.html#a8d1358baba080a2f6b0d350928af7a89">AD_OK</a>;</div>
<div class="line"><a name="l00717"></a><span class="lineno">  717</span>&#160;</div>
<div class="line"><a name="l00718"></a><span class="lineno">  718</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i = 0; i &lt; <a class="code" href="ad__server_8h.html#a387785dd0db9ef703e97eddf21674b05">AD_NUM_USERDATA</a>; i++) {</div>
<div class="line"><a name="l00719"></a><span class="lineno">  719</span>&#160;        <span class="keywordflow">if</span> (conn-&gt;<a class="code" href="structad__conn__s.html#a157c948a7cc7157aab058ecd34fea253">userdata</a>[i]) {</div>
<div class="line"><a name="l00720"></a><span class="lineno">  720</span>&#160;            <span class="keywordflow">if</span> (conn-&gt;<a class="code" href="structad__conn__s.html#a88cab228f7ce7dd4b54c1a2a5cbd2c72">userdata_free_cb</a>[i] != NULL) {</div>
<div class="line"><a name="l00721"></a><span class="lineno">  721</span>&#160;                conn-&gt;<a class="code" href="structad__conn__s.html#a88cab228f7ce7dd4b54c1a2a5cbd2c72">userdata_free_cb</a>[i](conn, conn-&gt;<a class="code" href="structad__conn__s.html#a157c948a7cc7157aab058ecd34fea253">userdata</a>[i]);</div>
<div class="line"><a name="l00722"></a><span class="lineno">  722</span>&#160;            } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00723"></a><span class="lineno">  723</span>&#160;                WARN(<span class="stringliteral">&quot;Found unreleased userdata.&quot;</span>);</div>
<div class="line"><a name="l00724"></a><span class="lineno">  724</span>&#160;            }</div>
<div class="line"><a name="l00725"></a><span class="lineno">  725</span>&#160;            conn-&gt;<a class="code" href="structad__conn__s.html#a157c948a7cc7157aab058ecd34fea253">userdata</a>[i] = NULL;</div>
<div class="line"><a name="l00726"></a><span class="lineno">  726</span>&#160;        }</div>
<div class="line"><a name="l00727"></a><span class="lineno">  727</span>&#160;    }</div>
<div class="line"><a name="l00728"></a><span class="lineno">  728</span>&#160;</div>
<div class="line"><a name="l00729"></a><span class="lineno">  729</span>&#160;    <span class="keywordflow">if</span> (conn-&gt;<a class="code" href="structad__conn__s.html#a3d78c01960c23c9a5db3216a74d903b5">method</a>) {</div>
<div class="line"><a name="l00730"></a><span class="lineno">  730</span>&#160;        free(conn-&gt;<a class="code" href="structad__conn__s.html#a3d78c01960c23c9a5db3216a74d903b5">method</a>);</div>
<div class="line"><a name="l00731"></a><span class="lineno">  731</span>&#160;        conn-&gt;<a class="code" href="structad__conn__s.html#a3d78c01960c23c9a5db3216a74d903b5">method</a> = NULL;</div>
<div class="line"><a name="l00732"></a><span class="lineno">  732</span>&#160;    }</div>
<div class="line"><a name="l00733"></a><span class="lineno">  733</span>&#160;}</div>
<div class="line"><a name="l00734"></a><span class="lineno">  734</span>&#160;</div>
<div class="line"><a name="l00735"></a><span class="lineno">  735</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> conn_free(<a class="code" href="structad__conn__s.html">ad_conn_t</a> *conn) {</div>
<div class="line"><a name="l00736"></a><span class="lineno">  736</span>&#160;    <span class="keywordflow">if</span> (conn) {</div>
<div class="line"><a name="l00737"></a><span class="lineno">  737</span>&#160;        <span class="keywordflow">if</span> (conn-&gt;<a class="code" href="structad__conn__s.html#a9b7fa3872345cd7caa315e401b7d8f7d">status</a> != <a class="code" href="ad__server_8h.html#a3b06b0e022e3225a5c252f0141cb5ae4">AD_CLOSE</a>) {</div>
<div class="line"><a name="l00738"></a><span class="lineno">  738</span>&#160;            call_hooks(<a class="code" href="ad__server_8h.html#af6be13c8801f47101a25514526b524a7">AD_EVENT_CLOSE</a> | <a class="code" href="ad__server_8h.html#ab3b205b8862fd4a318005466961934f1">AD_EVENT_SHUTDOWN</a> , conn);</div>
<div class="line"><a name="l00739"></a><span class="lineno">  739</span>&#160;        }</div>
<div class="line"><a name="l00740"></a><span class="lineno">  740</span>&#160;        conn_reset(conn);</div>
<div class="line"><a name="l00741"></a><span class="lineno">  741</span>&#160;        <span class="keywordflow">if</span> (conn-&gt;<a class="code" href="structad__conn__s.html#a2e3de19cb9eea56002d5adec7fad66cf">buffer</a>) {</div>
<div class="line"><a name="l00742"></a><span class="lineno">  742</span>&#160;            <span class="keywordflow">if</span> (conn-&gt;<a class="code" href="structad__conn__s.html#abb9074b951a064f2790c154475c19fa8">server</a>-&gt;<a class="code" href="structad__server__s.html#ac49ac0bf5c97d5c0ea7443c15860dc07">sslctx</a>) {</div>
<div class="line"><a name="l00743"></a><span class="lineno">  743</span>&#160;                <span class="keywordtype">int</span> sslerr = bufferevent_get_openssl_error(conn-&gt;<a class="code" href="structad__conn__s.html#a2e3de19cb9eea56002d5adec7fad66cf">buffer</a>);</div>
<div class="line"><a name="l00744"></a><span class="lineno">  744</span>&#160;                <span class="keywordflow">if</span> (sslerr) {</div>
<div class="line"><a name="l00745"></a><span class="lineno">  745</span>&#160;                    <span class="keywordtype">char</span> errmsg[256];</div>
<div class="line"><a name="l00746"></a><span class="lineno">  746</span>&#160;                    ERR_error_string_n(sslerr, errmsg, <span class="keyword">sizeof</span>(errmsg));</div>
<div class="line"><a name="l00747"></a><span class="lineno">  747</span>&#160;                    ERROR(<span class="stringliteral">&quot;SSL %s (err:%d)&quot;</span>, errmsg, sslerr);</div>
<div class="line"><a name="l00748"></a><span class="lineno">  748</span>&#160;                }</div>
<div class="line"><a name="l00749"></a><span class="lineno">  749</span>&#160;            }</div>
<div class="line"><a name="l00750"></a><span class="lineno">  750</span>&#160;            bufferevent_free(conn-&gt;<a class="code" href="structad__conn__s.html#a2e3de19cb9eea56002d5adec7fad66cf">buffer</a>);</div>
<div class="line"><a name="l00751"></a><span class="lineno">  751</span>&#160;        }</div>
<div class="line"><a name="l00752"></a><span class="lineno">  752</span>&#160;        free(conn);</div>
<div class="line"><a name="l00753"></a><span class="lineno">  753</span>&#160;    }</div>
<div class="line"><a name="l00754"></a><span class="lineno">  754</span>&#160;}</div>
<div class="line"><a name="l00755"></a><span class="lineno">  755</span>&#160;</div>
<div class="line"><a name="l00756"></a><span class="lineno">  756</span>&#160;<span class="preprocessor">#define DRAIN_EVBUFFER(b) evbuffer_drain(b, evbuffer_get_length(b))</span></div>
<div class="line"><a name="l00757"></a><span class="lineno">  757</span>&#160;<span class="preprocessor"></span><span class="keyword">static</span> <span class="keywordtype">void</span> conn_read_cb(<span class="keyword">struct</span> bufferevent *buffer, <span class="keywordtype">void</span> *userdata) {</div>
<div class="line"><a name="l00758"></a><span class="lineno">  758</span>&#160;    DEBUG(<span class="stringliteral">&quot;read_cb&quot;</span>);</div>
<div class="line"><a name="l00759"></a><span class="lineno">  759</span>&#160;    <a class="code" href="structad__conn__s.html">ad_conn_t</a> *conn = userdata;</div>
<div class="line"><a name="l00760"></a><span class="lineno">  760</span>&#160;    conn_cb(conn, <a class="code" href="ad__server_8h.html#a5cdb1e1bd63023d45c94447b4254b17d">AD_EVENT_READ</a>);</div>
<div class="line"><a name="l00761"></a><span class="lineno">  761</span>&#160;}</div>
<div class="line"><a name="l00762"></a><span class="lineno">  762</span>&#160;</div>
<div class="line"><a name="l00763"></a><span class="lineno">  763</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> conn_write_cb(<span class="keyword">struct</span> bufferevent *buffer, <span class="keywordtype">void</span> *userdata) {</div>
<div class="line"><a name="l00764"></a><span class="lineno">  764</span>&#160;    DEBUG(<span class="stringliteral">&quot;write_cb&quot;</span>);</div>
<div class="line"><a name="l00765"></a><span class="lineno">  765</span>&#160;    <a class="code" href="structad__conn__s.html">ad_conn_t</a> *conn = userdata;</div>
<div class="line"><a name="l00766"></a><span class="lineno">  766</span>&#160;    conn_cb(conn, <a class="code" href="ad__server_8h.html#a7ba189c66b4487ee0659d4b4e362ba4f">AD_EVENT_WRITE</a>);</div>
<div class="line"><a name="l00767"></a><span class="lineno">  767</span>&#160;}</div>
<div class="line"><a name="l00768"></a><span class="lineno">  768</span>&#160;</div>
<div class="line"><a name="l00769"></a><span class="lineno">  769</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> conn_event_cb(<span class="keyword">struct</span> bufferevent *buffer, <span class="keywordtype">short</span> what, <span class="keywordtype">void</span> *userdata) {</div>
<div class="line"><a name="l00770"></a><span class="lineno">  770</span>&#160;    DEBUG(<span class="stringliteral">&quot;event_cb 0x%x&quot;</span>, what);</div>
<div class="line"><a name="l00771"></a><span class="lineno">  771</span>&#160;    <a class="code" href="structad__conn__s.html">ad_conn_t</a> *conn = userdata;</div>
<div class="line"><a name="l00772"></a><span class="lineno">  772</span>&#160;</div>
<div class="line"><a name="l00773"></a><span class="lineno">  773</span>&#160;    <span class="keywordflow">if</span> (what &amp; BEV_EVENT_EOF || what &amp; BEV_EVENT_ERROR || what &amp; BEV_EVENT_TIMEOUT) {</div>
<div class="line"><a name="l00774"></a><span class="lineno">  774</span>&#160;        conn-&gt;<a class="code" href="structad__conn__s.html#a9b7fa3872345cd7caa315e401b7d8f7d">status</a> = <a class="code" href="ad__server_8h.html#a3b06b0e022e3225a5c252f0141cb5ae4">AD_CLOSE</a>;</div>
<div class="line"><a name="l00775"></a><span class="lineno">  775</span>&#160;        conn_cb(conn, <a class="code" href="ad__server_8h.html#af6be13c8801f47101a25514526b524a7">AD_EVENT_CLOSE</a> | ((what &amp; BEV_EVENT_TIMEOUT) ? <a class="code" href="ad__server_8h.html#a9dadbc14bb0003f3072d13594c81403e">AD_EVENT_TIMEOUT</a> : 0));</div>
<div class="line"><a name="l00776"></a><span class="lineno">  776</span>&#160;    }</div>
<div class="line"><a name="l00777"></a><span class="lineno">  777</span>&#160;}</div>
<div class="line"><a name="l00778"></a><span class="lineno">  778</span>&#160;</div>
<div class="line"><a name="l00779"></a><span class="lineno">  779</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> conn_cb(<a class="code" href="structad__conn__s.html">ad_conn_t</a> *conn, <span class="keywordtype">int</span> event) {</div>
<div class="line"><a name="l00780"></a><span class="lineno">  780</span>&#160;    DEBUG(<span class="stringliteral">&quot;conn_cb: status:0x%x, event:0x%x&quot;</span>, conn-&gt;<a class="code" href="structad__conn__s.html#a9b7fa3872345cd7caa315e401b7d8f7d">status</a>, event)</div>
<div class="line"><a name="l00781"></a><span class="lineno">  781</span>&#160;    if(conn-&gt;status == <a class="code" href="ad__server_8h.html#a8d1358baba080a2f6b0d350928af7a89">AD_OK</a> || conn-&gt;status == <a class="code" href="ad__server_8h.html#ab31b601df43a52ea6ca3647c62da51c4">AD_TAKEOVER</a>) {</div>
<div class="line"><a name="l00782"></a><span class="lineno">  782</span>&#160;        <span class="keywordtype">int</span> status = call_hooks(event, conn);</div>
<div class="line"><a name="l00783"></a><span class="lineno">  783</span>&#160;        <span class="comment">// Update status only when it&#39;s higher then before.</span></div>
<div class="line"><a name="l00784"></a><span class="lineno">  784</span>&#160;        <span class="keywordflow">if</span> (! (conn-&gt;<a class="code" href="structad__conn__s.html#a9b7fa3872345cd7caa315e401b7d8f7d">status</a> == <a class="code" href="ad__server_8h.html#a3b06b0e022e3225a5c252f0141cb5ae4">AD_CLOSE</a> || (conn-&gt;<a class="code" href="structad__conn__s.html#a9b7fa3872345cd7caa315e401b7d8f7d">status</a> == <a class="code" href="ad__server_8h.html#a65ea15debc10a5e82448ff065239c4ff">AD_DONE</a> &amp;&amp; conn-&gt;<a class="code" href="structad__conn__s.html#a9b7fa3872345cd7caa315e401b7d8f7d">status</a> &gt;= status))) {</div>
<div class="line"><a name="l00785"></a><span class="lineno">  785</span>&#160;            conn-&gt;<a class="code" href="structad__conn__s.html#a9b7fa3872345cd7caa315e401b7d8f7d">status</a> = status;</div>
<div class="line"><a name="l00786"></a><span class="lineno">  786</span>&#160;        }</div>
<div class="line"><a name="l00787"></a><span class="lineno">  787</span>&#160;    }</div>
<div class="line"><a name="l00788"></a><span class="lineno">  788</span>&#160;</div>
<div class="line"><a name="l00789"></a><span class="lineno">  789</span>&#160;    <span class="keywordflow">if</span>(conn-&gt;<a class="code" href="structad__conn__s.html#a9b7fa3872345cd7caa315e401b7d8f7d">status</a> == <a class="code" href="ad__server_8h.html#a65ea15debc10a5e82448ff065239c4ff">AD_DONE</a>) {</div>
<div class="line"><a name="l00790"></a><span class="lineno">  790</span>&#160;        <span class="keywordflow">if</span> (<a class="code" href="ad__server_8c.html#a2b2e3ec49198b4d35e29a95dc9f06dad">ad_server_get_option_int</a>(conn-&gt;<a class="code" href="structad__conn__s.html#abb9074b951a064f2790c154475c19fa8">server</a>, <span class="stringliteral">&quot;server.request_pipelining&quot;</span>)) {</div>
<div class="line"><a name="l00791"></a><span class="lineno">  791</span>&#160;            call_hooks(<a class="code" href="ad__server_8h.html#af6be13c8801f47101a25514526b524a7">AD_EVENT_CLOSE</a> , conn);</div>
<div class="line"><a name="l00792"></a><span class="lineno">  792</span>&#160;            conn_reset(conn);</div>
<div class="line"><a name="l00793"></a><span class="lineno">  793</span>&#160;            call_hooks(<a class="code" href="ad__server_8h.html#afcba550cce3f169b37f718e3a6a7a20c">AD_EVENT_INIT</a> , conn);</div>
<div class="line"><a name="l00794"></a><span class="lineno">  794</span>&#160;        } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00795"></a><span class="lineno">  795</span>&#160;            <span class="comment">// Do nothing but drain input buffer.</span></div>
<div class="line"><a name="l00796"></a><span class="lineno">  796</span>&#160;            <span class="keywordflow">if</span> (event == <a class="code" href="ad__server_8h.html#a5cdb1e1bd63023d45c94447b4254b17d">AD_EVENT_READ</a>) {</div>
<div class="line"><a name="l00797"></a><span class="lineno">  797</span>&#160;                DEBUG(<span class="stringliteral">&quot;Draining in-buffer. %d&quot;</span>, conn-&gt;<a class="code" href="structad__conn__s.html#a9b7fa3872345cd7caa315e401b7d8f7d">status</a>);</div>
<div class="line"><a name="l00798"></a><span class="lineno">  798</span>&#160;                DRAIN_EVBUFFER(conn-&gt;<a class="code" href="structad__conn__s.html#a0c33794bef5cb9c633c09026173f64cd">in</a>);</div>
<div class="line"><a name="l00799"></a><span class="lineno">  799</span>&#160;            }</div>
<div class="line"><a name="l00800"></a><span class="lineno">  800</span>&#160;        }</div>
<div class="line"><a name="l00801"></a><span class="lineno">  801</span>&#160;        <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00802"></a><span class="lineno">  802</span>&#160;    } <span class="keywordflow">else</span> <span class="keywordflow">if</span>(conn-&gt;<a class="code" href="structad__conn__s.html#a9b7fa3872345cd7caa315e401b7d8f7d">status</a> == <a class="code" href="ad__server_8h.html#a3b06b0e022e3225a5c252f0141cb5ae4">AD_CLOSE</a>) {</div>
<div class="line"><a name="l00803"></a><span class="lineno">  803</span>&#160;        <span class="keywordflow">if</span> (evbuffer_get_length(conn-&gt;<a class="code" href="structad__conn__s.html#a30d7905f017359ece17a8c7406fc20fc">out</a>) &lt;= 0) {</div>
<div class="line"><a name="l00804"></a><span class="lineno">  804</span>&#160;            <span class="keywordtype">int</span> newevent = (<span class="keyword">event</span> &amp; <a class="code" href="ad__server_8h.html#af6be13c8801f47101a25514526b524a7">AD_EVENT_CLOSE</a>) ? event : <a class="code" href="ad__server_8h.html#af6be13c8801f47101a25514526b524a7">AD_EVENT_CLOSE</a>;</div>
<div class="line"><a name="l00805"></a><span class="lineno">  805</span>&#160;            call_hooks(newevent, conn);</div>
<div class="line"><a name="l00806"></a><span class="lineno">  806</span>&#160;            conn_free(conn);</div>
<div class="line"><a name="l00807"></a><span class="lineno">  807</span>&#160;            DEBUG(<span class="stringliteral">&quot;Connection closed.&quot;</span>);</div>
<div class="line"><a name="l00808"></a><span class="lineno">  808</span>&#160;            <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00809"></a><span class="lineno">  809</span>&#160;        }</div>
<div class="line"><a name="l00810"></a><span class="lineno">  810</span>&#160;    }</div>
<div class="line"><a name="l00811"></a><span class="lineno">  811</span>&#160;}</div>
<div class="line"><a name="l00812"></a><span class="lineno">  812</span>&#160;</div>
<div class="line"><a name="l00813"></a><span class="lineno">  813</span>&#160;<span class="keyword">static</span> <span class="keywordtype">int</span> call_hooks(<span class="keywordtype">short</span> event, <a class="code" href="structad__conn__s.html">ad_conn_t</a> *conn) {</div>
<div class="line"><a name="l00814"></a><span class="lineno">  814</span>&#160;    DEBUG(<span class="stringliteral">&quot;call_hooks: event 0x%x&quot;</span>, event);</div>
<div class="line"><a name="l00815"></a><span class="lineno">  815</span>&#160;    qlist_t *hooks = conn-&gt;<a class="code" href="structad__conn__s.html#abb9074b951a064f2790c154475c19fa8">server</a>-&gt;<a class="code" href="structad__server__s.html#a23ca15bb12d9df2e28bd54dbdebc9fc3">hooks</a>;</div>
<div class="line"><a name="l00816"></a><span class="lineno">  816</span>&#160;</div>
<div class="line"><a name="l00817"></a><span class="lineno">  817</span>&#160;    qlist_obj_t obj;</div>
<div class="line"><a name="l00818"></a><span class="lineno">  818</span>&#160;    bzero((<span class="keywordtype">void</span> *)&amp;obj, <span class="keyword">sizeof</span>(qlist_obj_t));</div>
<div class="line"><a name="l00819"></a><span class="lineno">  819</span>&#160;    <span class="keywordflow">while</span> (hooks-&gt;getnext(hooks, &amp;obj, <span class="keyword">false</span>) == <span class="keyword">true</span>) {</div>
<div class="line"><a name="l00820"></a><span class="lineno">  820</span>&#160;        ad_hook_t *hook = (ad_hook_t *)obj.data;</div>
<div class="line"><a name="l00821"></a><span class="lineno">  821</span>&#160;        if (hook-&gt;cb) {</div>
<div class="line"><a name="l00822"></a><span class="lineno">  822</span>&#160;            <span class="keywordflow">if</span> (hook-&gt;method &amp;&amp; conn-&gt;<a class="code" href="structad__conn__s.html#a3d78c01960c23c9a5db3216a74d903b5">method</a> &amp;&amp; strcmp(hook-&gt;method, conn-&gt;<a class="code" href="structad__conn__s.html#a3d78c01960c23c9a5db3216a74d903b5">method</a>)) {</div>
<div class="line"><a name="l00823"></a><span class="lineno">  823</span>&#160;                <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00824"></a><span class="lineno">  824</span>&#160;            }</div>
<div class="line"><a name="l00825"></a><span class="lineno">  825</span>&#160;            <span class="keywordtype">int</span> status = hook-&gt;cb(event, conn, hook-&gt;<a class="code" href="structad__conn__s.html#a157c948a7cc7157aab058ecd34fea253">userdata</a>);</div>
<div class="line"><a name="l00826"></a><span class="lineno">  826</span>&#160;            <span class="keywordflow">if</span> (status != <a class="code" href="ad__server_8h.html#a8d1358baba080a2f6b0d350928af7a89">AD_OK</a>) {</div>
<div class="line"><a name="l00827"></a><span class="lineno">  827</span>&#160;                <span class="keywordflow">return</span> status;</div>
<div class="line"><a name="l00828"></a><span class="lineno">  828</span>&#160;            }</div>
<div class="line"><a name="l00829"></a><span class="lineno">  829</span>&#160;        }</div>
<div class="line"><a name="l00830"></a><span class="lineno">  830</span>&#160;    }</div>
<div class="line"><a name="l00831"></a><span class="lineno">  831</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="ad__server_8h.html#a8d1358baba080a2f6b0d350928af7a89">AD_OK</a>;</div>
<div class="line"><a name="l00832"></a><span class="lineno">  832</span>&#160;}</div>
<div class="line"><a name="l00833"></a><span class="lineno">  833</span>&#160;</div>
<div class="line"><a name="l00834"></a><span class="lineno">  834</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> *set_userdata(<a class="code" href="structad__conn__s.html">ad_conn_t</a> *conn, <span class="keywordtype">int</span> index, <span class="keyword">const</span> <span class="keywordtype">void</span> *userdata, <a class="code" href="ad__server_8h.html#a483770c2534078a7ca37b2e6590329b8">ad_userdata_free_cb</a> free_cb) {</div>
<div class="line"><a name="l00835"></a><span class="lineno">  835</span>&#160;    <span class="keywordtype">void</span> *prev = conn-&gt;<a class="code" href="structad__conn__s.html#a157c948a7cc7157aab058ecd34fea253">userdata</a>;</div>
<div class="line"><a name="l00836"></a><span class="lineno">  836</span>&#160;    conn-&gt;<a class="code" href="structad__conn__s.html#a157c948a7cc7157aab058ecd34fea253">userdata</a>[index] = (<span class="keywordtype">void</span> *)userdata;</div>
<div class="line"><a name="l00837"></a><span class="lineno">  837</span>&#160;    conn-&gt;<a class="code" href="structad__conn__s.html#a88cab228f7ce7dd4b54c1a2a5cbd2c72">userdata_free_cb</a>[index] = free_cb;</div>
<div class="line"><a name="l00838"></a><span class="lineno">  838</span>&#160;    <span class="keywordflow">return</span> prev;</div>
<div class="line"><a name="l00839"></a><span class="lineno">  839</span>&#160;}</div>
<div class="line"><a name="l00840"></a><span class="lineno">  840</span>&#160;</div>
<div class="line"><a name="l00841"></a><span class="lineno">  841</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> *get_userdata(<a class="code" href="structad__conn__s.html">ad_conn_t</a> *conn, <span class="keywordtype">int</span> index) {</div>
<div class="line"><a name="l00842"></a><span class="lineno">  842</span>&#160;    <span class="keywordflow">return</span> conn-&gt;<a class="code" href="structad__conn__s.html#a157c948a7cc7157aab058ecd34fea253">userdata</a>[index];</div>
<div class="line"><a name="l00843"></a><span class="lineno">  843</span>&#160;}</div>
<div class="line"><a name="l00844"></a><span class="lineno">  844</span>&#160;</div>
<div class="line"><a name="l00845"></a><span class="lineno">  845</span>&#160;<span class="preprocessor">#endif // _DOXYGEN_SKIP</span></div>
<div class="ttc" id="ad__server_8c_html_aeb61485fd4f4e2f13c93871558b58025"><div class="ttname"><a href="ad__server_8c.html#aeb61485fd4f4e2f13c93871558b58025">ad_server_register_hook</a></div><div class="ttdeci">void ad_server_register_hook(ad_server_t *server, ad_callback cb, void *userdata)</div><div class="ttdoc">Register user hook. </div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8c_source.html#l00468">ad_server.c:468</a></div></div>
<div class="ttc" id="ad__server_8c_html_aef5876145774e9c6d38e68c06d05e34c"><div class="ttname"><a href="ad__server_8c.html#aef5876145774e9c6d38e68c06d05e34c">ad_conn_set_method</a></div><div class="ttdeci">void ad_conn_set_method(ad_conn_t *conn, char *method)</div><div class="ttdoc">Set method name on this connection. </div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8c_source.html#l00532">ad_server.c:532</a></div></div>
<div class="ttc" id="structad__server__s_html_ae17a39413f5822b4456e96b9ebd30a5d"><div class="ttname"><a href="structad__server__s.html#ae17a39413f5822b4456e96b9ebd30a5d">ad_server_s::notify_buffer</a></div><div class="ttdeci">struct bufferevent * notify_buffer</div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8h_source.html#l00153">ad_server.h:153</a></div></div>
<div class="ttc" id="ad__server_8c_html_a75c74385ae98f9c9457534db0557d98e"><div class="ttname"><a href="ad__server_8c.html#a75c74385ae98f9c9457534db0557d98e">ad_server_start</a></div><div class="ttdeci">int ad_server_start(ad_server_t *server)</div><div class="ttdoc">Start server. </div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8c_source.html#l00164">ad_server.c:164</a></div></div>
<div class="ttc" id="ad__server_8c_html_addb05a5f42de5b20975a92fa69b52895"><div class="ttname"><a href="ad__server_8c.html#addb05a5f42de5b20975a92fa69b52895">ad_server_get_ssl_ctx</a></div><div class="ttdeci">SSL_CTX * ad_server_get_ssl_ctx(ad_server_t *server)</div><div class="ttdoc">Get OpenSSL SSL_CTX object. </div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8c_source.html#l00454">ad_server.c:454</a></div></div>
<div class="ttc" id="structad__server__s_html_ac0c82aed3c82235b3788796bc7a83e0b"><div class="ttname"><a href="structad__server__s.html#ac0c82aed3c82235b3788796bc7a83e0b">ad_server_s::errcode</a></div><div class="ttdeci">int errcode</div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8h_source.html#l00143">ad_server.h:143</a></div></div>
<div class="ttc" id="ad__server_8c_html_ac7ad549632ecf501e170aac234703541"><div class="ttname"><a href="ad__server_8c.html#ac7ad549632ecf501e170aac234703541">ad_server_ssl_ctx_create_simple</a></div><div class="ttdeci">SSL_CTX * ad_server_ssl_ctx_create_simple(const char *cert_path, const char *pkey_path)</div><div class="ttdoc">Helper method for creating minimal OpenSSL SSL_CTX object. </div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8c_source.html#l00404">ad_server.c:404</a></div></div>
<div class="ttc" id="ad__server_8h_html_a0fe91d344bc3f1610ea68bcec077b1c2a8812ea0ff35c50043b69112e5988e906"><div class="ttname"><a href="ad__server_8h.html#a0fe91d344bc3f1610ea68bcec077b1c2a8812ea0ff35c50043b69112e5988e906">AD_LOG_DEBUG</a></div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8h_source.html#l00070">ad_server.h:70</a></div></div>
<div class="ttc" id="structad__conn__s_html_a9b7fa3872345cd7caa315e401b7d8f7d"><div class="ttname"><a href="structad__conn__s.html#a9b7fa3872345cd7caa315e401b7d8f7d">ad_conn_s::status</a></div><div class="ttdeci">int status</div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8h_source.html#l00164">ad_server.h:164</a></div></div>
<div class="ttc" id="ad__server_8c_html_add3ea8aae949c0fa5a6bc9b0b0e1ec70"><div class="ttname"><a href="ad__server_8c.html#add3ea8aae949c0fa5a6bc9b0b0e1ec70">ad_server_free</a></div><div class="ttdeci">void ad_server_free(ad_server_t *server)</div><div class="ttdoc">Release server object and all the resources. </div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8c_source.html#l00303">ad_server.c:303</a></div></div>
<div class="ttc" id="structad__server__s_html_ae8cecf112a838b40cd5b94b9b57597c0"><div class="ttname"><a href="structad__server__s.html#ae8cecf112a838b40cd5b94b9b57597c0">ad_server_s::stats</a></div><div class="ttdeci">qhashtbl_t * stats</div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8h_source.html#l00147">ad_server.h:147</a></div></div>
<div class="ttc" id="structad__conn__s_html_a2e3de19cb9eea56002d5adec7fad66cf"><div class="ttname"><a href="structad__conn__s.html#a2e3de19cb9eea56002d5adec7fad66cf">ad_conn_s::buffer</a></div><div class="ttdeci">struct bufferevent * buffer</div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8h_source.html#l00161">ad_server.h:161</a></div></div>
<div class="ttc" id="ad__server_8h_html_a7ba189c66b4487ee0659d4b4e362ba4f"><div class="ttname"><a href="ad__server_8h.html#a7ba189c66b4487ee0659d4b4e362ba4f">AD_EVENT_WRITE</a></div><div class="ttdeci">#define AD_EVENT_WRITE</div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8h_source.html#l00125">ad_server.h:125</a></div></div>
<div class="ttc" id="structad__server__s_html_ac49ac0bf5c97d5c0ea7443c15860dc07"><div class="ttname"><a href="structad__server__s.html#ac49ac0bf5c97d5c0ea7443c15860dc07">ad_server_s::sslctx</a></div><div class="ttdeci">SSL_CTX * sslctx</div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8h_source.html#l00151">ad_server.h:151</a></div></div>
<div class="ttc" id="ad__server_8h_html_a9dadbc14bb0003f3072d13594c81403e"><div class="ttname"><a href="ad__server_8h.html#a9dadbc14bb0003f3072d13594c81403e">AD_EVENT_TIMEOUT</a></div><div class="ttdeci">#define AD_EVENT_TIMEOUT</div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8h_source.html#l00127">ad_server.h:127</a></div></div>
<div class="ttc" id="ad__server_8h_html_a387785dd0db9ef703e97eddf21674b05"><div class="ttname"><a href="ad__server_8h.html#a387785dd0db9ef703e97eddf21674b05">AD_NUM_USERDATA</a></div><div class="ttdeci">#define AD_NUM_USERDATA</div><div class="ttdoc">Defaults. </div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8h_source.html#l00133">ad_server.h:133</a></div></div>
<div class="ttc" id="ad__server_8h_html_ab3b205b8862fd4a318005466961934f1"><div class="ttname"><a href="ad__server_8h.html#ab3b205b8862fd4a318005466961934f1">AD_EVENT_SHUTDOWN</a></div><div class="ttdeci">#define AD_EVENT_SHUTDOWN</div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8h_source.html#l00128">ad_server.h:128</a></div></div>
<div class="ttc" id="ad__server_8c_html_ac67bad711ee893259d4c4dc3717596ab"><div class="ttname"><a href="ad__server_8c.html#ac67bad711ee893259d4c4dc3717596ab">ad_server_get_option</a></div><div class="ttdeci">char * ad_server_get_option(ad_server_t *server, const char *key)</div><div class="ttdoc">Retrieve server option. </div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8c_source.html#l00377">ad_server.c:377</a></div></div>
<div class="ttc" id="ad__server_8h_html_a3b06b0e022e3225a5c252f0141cb5ae4"><div class="ttname"><a href="ad__server_8h.html#a3b06b0e022e3225a5c252f0141cb5ae4">AD_CLOSE</a></div><div class="ttdeci">#define AD_CLOSE</div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8h_source.html#l00060">ad_server.h:60</a></div></div>
<div class="ttc" id="structad__conn__s_html_a30d7905f017359ece17a8c7406fc20fc"><div class="ttname"><a href="structad__conn__s.html#a30d7905f017359ece17a8c7406fc20fc">ad_conn_s::out</a></div><div class="ttdeci">struct evbuffer * out</div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8h_source.html#l00163">ad_server.h:163</a></div></div>
<div class="ttc" id="ad__server_8h_html_af6be13c8801f47101a25514526b524a7"><div class="ttname"><a href="ad__server_8h.html#af6be13c8801f47101a25514526b524a7">AD_EVENT_CLOSE</a></div><div class="ttdeci">#define AD_EVENT_CLOSE</div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8h_source.html#l00126">ad_server.h:126</a></div></div>
<div class="ttc" id="ad__server_8h_html_adc215edc66db6333bb058fb84ed332ca"><div class="ttname"><a href="ad__server_8h.html#adc215edc66db6333bb058fb84ed332ca">AD_SERVER_OPTIONS</a></div><div class="ttdeci">#define AD_SERVER_OPTIONS</div><div class="ttdoc">Server option names and default values. </div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8h_source.html#l00081">ad_server.h:81</a></div></div>
<div class="ttc" id="structad__conn__s_html_a0c33794bef5cb9c633c09026173f64cd"><div class="ttname"><a href="structad__conn__s.html#a0c33794bef5cb9c633c09026173f64cd">ad_conn_s::in</a></div><div class="ttdeci">struct evbuffer * in</div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8h_source.html#l00162">ad_server.h:162</a></div></div>
<div class="ttc" id="ad__server_8h_html_a0fe91d344bc3f1610ea68bcec077b1c2"><div class="ttname"><a href="ad__server_8h.html#a0fe91d344bc3f1610ea68bcec077b1c2">ad_log_e</a></div><div class="ttdeci">ad_log_e</div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8h_source.html#l00065">ad_server.h:65</a></div></div>
<div class="ttc" id="ad__server_8c_html_a15edb8d7e1f406085dbf8c5a5c671bda"><div class="ttname"><a href="ad__server_8c.html#a15edb8d7e1f406085dbf8c5a5c671bda">ad_server_set_option</a></div><div class="ttdeci">void ad_server_set_option(ad_server_t *server, const char *key, const char *value)</div><div class="ttdoc">Set server option. </div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8c_source.html#l00370">ad_server.c:370</a></div></div>
<div class="ttc" id="structad__conn__s_html_abb9074b951a064f2790c154475c19fa8"><div class="ttname"><a href="structad__conn__s.html#abb9074b951a064f2790c154475c19fa8">ad_conn_s::server</a></div><div class="ttdeci">ad_server_t * server</div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8h_source.html#l00160">ad_server.h:160</a></div></div>
<div class="ttc" id="structad__server__s_html_ae184c2444743aa61f16b5228820087e6"><div class="ttname"><a href="structad__server__s.html#ae184c2444743aa61f16b5228820087e6">ad_server_s::listener</a></div><div class="ttdeci">struct evconnlistener * listener</div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8h_source.html#l00149">ad_server.h:149</a></div></div>
<div class="ttc" id="ad__server_8c_html_a2b2e3ec49198b4d35e29a95dc9f06dad"><div class="ttname"><a href="ad__server_8c.html#a2b2e3ec49198b4d35e29a95dc9f06dad">ad_server_get_option_int</a></div><div class="ttdeci">int ad_server_get_option_int(ad_server_t *server, const char *key)</div><div class="ttdoc">Retrieve server option in integer format. </div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8c_source.html#l00384">ad_server.c:384</a></div></div>
<div class="ttc" id="structad__conn__s_html_a3d78c01960c23c9a5db3216a74d903b5"><div class="ttname"><a href="structad__conn__s.html#a3d78c01960c23c9a5db3216a74d903b5">ad_conn_s::method</a></div><div class="ttdeci">char * method</div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8h_source.html#l00168">ad_server.h:168</a></div></div>
<div class="ttc" id="structad__conn__s_html_a88cab228f7ce7dd4b54c1a2a5cbd2c72"><div class="ttname"><a href="structad__conn__s.html#a88cab228f7ce7dd4b54c1a2a5cbd2c72">ad_conn_s::userdata_free_cb</a></div><div class="ttdeci">ad_userdata_free_cb userdata_free_cb[2]</div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8h_source.html#l00167">ad_server.h:167</a></div></div>
<div class="ttc" id="structad__server__s_html_a2c75af08b7483c596b278c4c022cf9d5"><div class="ttname"><a href="structad__server__s.html#a2c75af08b7483c596b278c4c022cf9d5">ad_server_s::options</a></div><div class="ttdeci">qhashtbl_t * options</div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8h_source.html#l00146">ad_server.h:146</a></div></div>
<div class="ttc" id="ad__server_8c_html_a677263079eb999133e9a0be48dd2cba5"><div class="ttname"><a href="ad__server_8c.html#a677263079eb999133e9a0be48dd2cba5">ad_server_new</a></div><div class="ttdeci">ad_server_t * ad_server_new(void)</div><div class="ttdoc">Create a server object. </div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8c_source.html#l00135">ad_server.c:135</a></div></div>
<div class="ttc" id="ad__server_8h_html_a483770c2534078a7ca37b2e6590329b8"><div class="ttname"><a href="ad__server_8h.html#a483770c2534078a7ca37b2e6590329b8">ad_userdata_free_cb</a></div><div class="ttdeci">void(* ad_userdata_free_cb)(ad_conn_t *conn, void *userdata)</div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8h_source.html#l00118">ad_server.h:118</a></div></div>
<div class="ttc" id="structad__conn__s_html"><div class="ttname"><a href="structad__conn__s.html">ad_conn_s</a></div><div class="ttdoc">Connection structure. </div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8h_source.html#l00159">ad_server.h:159</a></div></div>
<div class="ttc" id="ad__server_8h_html_afcba550cce3f169b37f718e3a6a7a20c"><div class="ttname"><a href="ad__server_8h.html#afcba550cce3f169b37f718e3a6a7a20c">AD_EVENT_INIT</a></div><div class="ttdeci">#define AD_EVENT_INIT</div><div class="ttdoc">Event types. </div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8h_source.html#l00123">ad_server.h:123</a></div></div>
<div class="ttc" id="ad__server_8h_html_a5cdb1e1bd63023d45c94447b4254b17d"><div class="ttname"><a href="ad__server_8h.html#a5cdb1e1bd63023d45c94447b4254b17d">AD_EVENT_READ</a></div><div class="ttdeci">#define AD_EVENT_READ</div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8h_source.html#l00124">ad_server.h:124</a></div></div>
<div class="ttc" id="ad__server_8c_html_aebeaab98b3cd2af4201083b56142eab7"><div class="ttname"><a href="ad__server_8c.html#aebeaab98b3cd2af4201083b56142eab7">_ad_log_level</a></div><div class="ttdeci">int _ad_log_level</div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8c_source.html#l00108">ad_server.c:108</a></div></div>
<div class="ttc" id="ad__server_8c_html_a6e2e8a73baf14dafa0842b76f31765df"><div class="ttname"><a href="ad__server_8c.html#a6e2e8a73baf14dafa0842b76f31765df">ad_conn_set_userdata</a></div><div class="ttdeci">void * ad_conn_set_userdata(ad_conn_t *conn, const void *userdata, ad_userdata_free_cb free_cb)</div><div class="ttdoc">Attach userdata into the connection. </div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8c_source.html#l00490">ad_server.c:490</a></div></div>
<div class="ttc" id="structad__conn__s_html_a157c948a7cc7157aab058ecd34fea253"><div class="ttname"><a href="structad__conn__s.html#a157c948a7cc7157aab058ecd34fea253">ad_conn_s::userdata</a></div><div class="ttdeci">void * userdata[2]</div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8h_source.html#l00166">ad_server.h:166</a></div></div>
<div class="ttc" id="ad__server_8h_html_ab31b601df43a52ea6ca3647c62da51c4"><div class="ttname"><a href="ad__server_8h.html#ab31b601df43a52ea6ca3647c62da51c4">AD_TAKEOVER</a></div><div class="ttdeci">#define AD_TAKEOVER</div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8h_source.html#l00058">ad_server.h:58</a></div></div>
<div class="ttc" id="ad__server_8h_html"><div class="ttname"><a href="ad__server_8h.html">ad_server.h</a></div><div class="ttdoc">ad_server header file </div></div>
<div class="ttc" id="ad__server_8c_html_a5ed8e931164315ca27568958a1d70316"><div class="ttname"><a href="ad__server_8c.html#a5ed8e931164315ca27568958a1d70316">ad_conn_set_extra</a></div><div class="ttdeci">void * ad_conn_set_extra(ad_conn_t *conn, const void *extra, ad_userdata_free_cb free_cb)</div><div class="ttdoc">Set extra userdata into the connection. </div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8c_source.html#l00513">ad_server.c:513</a></div></div>
<div class="ttc" id="ad__server_8c_html_a4c319c4143b999a1c5e4b6d17415a500"><div class="ttname"><a href="ad__server_8c.html#a4c319c4143b999a1c5e4b6d17415a500">ad_server_register_hook_on_method</a></div><div class="ttdeci">void ad_server_register_hook_on_method(ad_server_t *server, const char *method, ad_callback cb, void *userdata)</div><div class="ttdoc">Register user hook on method name. </div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8c_source.html#l00475">ad_server.c:475</a></div></div>
<div class="ttc" id="ad__server_8c_html_a34aa318f8a3872aa1e756adb38acd664"><div class="ttname"><a href="ad__server_8c.html#a34aa318f8a3872aa1e756adb38acd664">ad_server_set_ssl_ctx</a></div><div class="ttdeci">void ad_server_set_ssl_ctx(ad_server_t *server, SSL_CTX *sslctx)</div><div class="ttdoc">Attach OpenSSL SSL_CTX to the server. </div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8c_source.html#l00434">ad_server.c:434</a></div></div>
<div class="ttc" id="ad__server_8c_html_a7fa3e3215415c9f7173f11ea1d276b8e"><div class="ttname"><a href="ad__server_8c.html#a7fa3e3215415c9f7173f11ea1d276b8e">ad_server_get_stats</a></div><div class="ttdeci">qhashtbl_t * ad_server_get_stats(ad_server_t *server, const char *key)</div><div class="ttdoc">Return internal statistic counter map. </div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8c_source.html#l00461">ad_server.c:461</a></div></div>
<div class="ttc" id="ad__server_8h_html_a0fe91d344bc3f1610ea68bcec077b1c2ab705340dfe4deb52d8add04540e45b95"><div class="ttname"><a href="ad__server_8h.html#a0fe91d344bc3f1610ea68bcec077b1c2ab705340dfe4deb52d8add04540e45b95">AD_LOG_WARN</a></div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8h_source.html#l00068">ad_server.h:68</a></div></div>
<div class="ttc" id="ad__server_8c_html_a5ba67b542d4ba48ad4a25280d10ef86f"><div class="ttname"><a href="ad__server_8c.html#a5ba67b542d4ba48ad4a25280d10ef86f">ad_conn_get_socket</a></div><div class="ttdeci">int ad_conn_get_socket(ad_conn_t *conn)</div><div class="ttdoc">Return socket file descriptor associated with a connection. </div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8c_source.html#l00543">ad_server.c:543</a></div></div>
<div class="ttc" id="ad__server_8c_html_a1f407e2708a0c9a141d5cbeed190d73b"><div class="ttname"><a href="ad__server_8c.html#a1f407e2708a0c9a141d5cbeed190d73b">ad_log_level</a></div><div class="ttdeci">enum ad_log_e ad_log_level(enum ad_log_e log_level)</div><div class="ttdoc">Set debug output level. </div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8c_source.html#l00126">ad_server.c:126</a></div></div>
<div class="ttc" id="ad__server_8h_html_a659a16c6e03fa96212bff528033efc84"><div class="ttname"><a href="ad__server_8h.html#a659a16c6e03fa96212bff528033efc84">ad_callback</a></div><div class="ttdeci">int(* ad_callback)(short event, ad_conn_t *conn, void *userdata)</div><div class="ttdoc">User callback(hook) prototype. </div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8h_source.html#l00117">ad_server.h:117</a></div></div>
<div class="ttc" id="structad__server__s_html_a23ca15bb12d9df2e28bd54dbdebc9fc3"><div class="ttname"><a href="structad__server__s.html#a23ca15bb12d9df2e28bd54dbdebc9fc3">ad_server_s::hooks</a></div><div class="ttdeci">qlist_t * hooks</div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8h_source.html#l00148">ad_server.h:148</a></div></div>
<div class="ttc" id="ad__server_8h_html_a8d1358baba080a2f6b0d350928af7a89"><div class="ttname"><a href="ad__server_8h.html#a8d1358baba080a2f6b0d350928af7a89">AD_OK</a></div><div class="ttdeci">#define AD_OK</div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8h_source.html#l00057">ad_server.h:57</a></div></div>
<div class="ttc" id="ad__server_8c_html_ad6dd41a4169cd1fcbac17462fa6b5cf8"><div class="ttname"><a href="ad__server_8c.html#ad6dd41a4169cd1fcbac17462fa6b5cf8">ad_conn_get_extra</a></div><div class="ttdeci">void * ad_conn_get_extra(ad_conn_t *conn)</div><div class="ttdoc">Get extra userdata attached in this connection. </div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8c_source.html#l00520">ad_server.c:520</a></div></div>
<div class="ttc" id="structad__server__s_html_ad09ee6ca2678d9e42124ae9d4b96d9fe"><div class="ttname"><a href="structad__server__s.html#ad09ee6ca2678d9e42124ae9d4b96d9fe">ad_server_s::thread</a></div><div class="ttdeci">pthread_t * thread</div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8h_source.html#l00144">ad_server.h:144</a></div></div>
<div class="ttc" id="structad__server__s_html"><div class="ttname"><a href="structad__server__s.html">ad_server_s</a></div><div class="ttdoc">Server info container. </div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8h_source.html#l00142">ad_server.h:142</a></div></div>
<div class="ttc" id="ad__server_8h_html_a0fe91d344bc3f1610ea68bcec077b1c2a169716146eb4ebd68a9dfab24c9d018d"><div class="ttname"><a href="ad__server_8h.html#a0fe91d344bc3f1610ea68bcec077b1c2a169716146eb4ebd68a9dfab24c9d018d">AD_LOG_DEBUG2</a></div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8h_source.html#l00071">ad_server.h:71</a></div></div>
<div class="ttc" id="ad__server_8h_html_a65ea15debc10a5e82448ff065239c4ff"><div class="ttname"><a href="ad__server_8h.html#a65ea15debc10a5e82448ff065239c4ff">AD_DONE</a></div><div class="ttdeci">#define AD_DONE</div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8h_source.html#l00059">ad_server.h:59</a></div></div>
<div class="ttc" id="structad__server__s_html_aa156a47562ec35a753d44be40c2bd155"><div class="ttname"><a href="structad__server__s.html#aa156a47562ec35a753d44be40c2bd155">ad_server_s::evbase</a></div><div class="ttdeci">struct event_base * evbase</div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8h_source.html#l00150">ad_server.h:150</a></div></div>
<div class="ttc" id="ad__server_8c_html_ac38aa4f50412ec4e3ed0e4f9b387e115"><div class="ttname"><a href="ad__server_8c.html#ac38aa4f50412ec4e3ed0e4f9b387e115">ad_server_global_free</a></div><div class="ttdeci">void ad_server_global_free(void)</div><div class="ttdoc">Clean up all the global objects. </div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8c_source.html#l00352">ad_server.c:352</a></div></div>
<div class="ttc" id="ad__server_8c_html_a7c8229a12c31ee8a75a8099bae6dcf81"><div class="ttname"><a href="ad__server_8c.html#a7c8229a12c31ee8a75a8099bae6dcf81">ad_server_stop</a></div><div class="ttdeci">void ad_server_stop(ad_server_t *server)</div><div class="ttdoc">Stop server. </div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8c_source.html#l00287">ad_server.c:287</a></div></div>
<div class="ttc" id="ad__server_8c_html_ae5630244c7bb627a0561439f3cd24aca"><div class="ttname"><a href="ad__server_8c.html#ae5630244c7bb627a0561439f3cd24aca">ad_conn_get_userdata</a></div><div class="ttdeci">void * ad_conn_get_userdata(ad_conn_t *conn)</div><div class="ttdoc">Get userdata attached in the connection. </div><div class="ttdef"><b>Definition:</b> <a href="ad__server_8c_source.html#l00499">ad_server.c:499</a></div></div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
  <ul>
    <li class="navelem"><a class="el" href="ad__server_8c.html">ad_server.c</a></li>
    <li class="footer">Generated by
    <a href="http://www.doxygen.org/index.html">
    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.6 </li>
  </ul>
</div>
</body>
</html>
